帝国cms相关搜索调用优化

帝国里面,我有一个新想法,增加一个表,存储所有文章的关键词,并将有关文章的id汇聚在一起,类似一种搜索聚合效果

这样做的好处就是可以再文章里面调用指定关键词的文章,可以抛开帝国原本自带的相关搜索聚合功能!

因为帝国原本自带的相关搜索聚合功能过于缓慢!(采用sql模糊查询,数据十万以上,如果服务器拉胯一点,简直难受!)

1.创建对应的关键词数据表


CREATE TABLE `phome_keywords` ( `id` INT(10) NOT NULL AUTO_INCREMENT , `md5` CHAR(32) NOT NULL , `title` VARCHAR(100) NOT NULL , `keyid` TEXT NOT NULL , PRIMARY KEY (`id`)) ENGINE = InnoDB;

2.将所有的文章关键词分配到这个表里,建立一个PHP文件,写代码

第一步:导出所有的关键词,我用代码倒….其实直接导出数据库才是最快的




<?php
echo '<meta http-equiv="refresh" content="2"/>';        // 自动跳转
require('../e/class/connect.php');        //引入数据库配置文件和公共函数文件
require('../e/class/db_sql.php');        //引入数据库操作文件
$link=db_connect();                //连接MYSQL
$empire=new mysqlquery();        //声明数据库操作类

// 参数配置
$num = 10000;     //每次修改多少条数据
// 获取页数
$file = "ktabe.txt";
if(file_exists($file)){
    $page_num = file_get_contents($file);
}else{
    $page_num = 0;
}
$page_id = $page_num*$num;
$sql=$empire->query("select id,keyboard from {$dbtbpre}ecms_news where `keyboard` != '22' or `keyboard` != ''  limit {$page_id},{$num}"); 
//查询新闻表最新10条记录
while($r=$empire->fetch($sql))        //循环获取查询记录
{
if(empty($r['id'])){
    exit;
}
echo $r['id'].'<br>';
$array = explode(",",$r['keyboard']);
foreach ($array as $v) {
    file_put_contents("ktabe_cache.txt",$v."\n",FILE_APPEND);
}
$array = [];

}

$page_num++;
file_put_contents($file,$page_num);     //记录下次需要查询的页面

db_close();                        //关闭MYSQL链接
$empire=null;                        //注消操作类变量
?>

第二步,将整理好的关键词导入数据表




<?php
// echo '<meta http-equiv="refresh" content="2"/>';        // 自动跳转
require('../e/class/connect.php');        //引入数据库配置文件和公共函数文件
require('../e/class/db_sql.php');        //引入数据库操作文件
$link=db_connect();                //连接MYSQL
$empire=new mysqlquery();        //声明数据库操作类

$file = "ktabe_cache.txt";
$content = file_get_contents($file);
$array = explode(PHP_EOL,$content);
// print_r($array);
$i=1;
foreach ($array as $k=>$v){
    $v = stripslashes($v);
    $sql.= "(null,'".md5($v)."', '{$v}', ''),";
    // echo $sql;
    if($i>=100){
        $sql = rtrim($sql,',');
        $empire->query("INSERT INTO `{$dbtbpre}keywords` (`id`,`md5`, `title`, `keyid`) VALUES $sql;");
        $sql = '';
        $i=1;
    }
    $i++;
}
$sql = rtrim($sql,',');
$empire->query("INSERT INTO `{$dbtbpre}keywords` (`id`,`md5`, `title`, `keyid`) VALUES $sql;");

db_close();                        //关闭MYSQL链接
$empire=null;                        //注消操作类变量
?>

第三步,去重处理



<?php

require('../e/class/connect.php');        //引入数据库配置文件和公共函数文件
require('../e/class/db_sql.php');        //引入数据库操作文件
$link=db_connect();                //连接MYSQL
$empire=new mysqlquery();        //声明数据库操作类
$sql=$empire->query("SELECT id,md5, count( md5 ) FROM `phome_keywords` GROUP BY md5 HAVING count( md5 ) > 1 limit 10000");
if(empty($sql)){
    die;
}else{
    echo '<meta http-equiv="refresh" content="2"/>';
}
while($r=$empire->fetch($sql))        //循环获取查询记录
{
    $empire->query("DELETE FROM `phome_keywords` WHERE `id` = {$r['id']};\n");
    echo $r['id']."  ";
}

echo "两秒后进行第二次删除";

db_close();                        //关闭MYSQL链接
$empire=null;                        //注消操作类变量
?>

代码写好了,运行便可以把新闻表里面的文章关键词给一个一个的分化到关键词数据表中!

去重主要用到的sql:


SELECT id, md5, count( md5 ) FROM `phome_keywords` GROUP BY md5 HAVING count( md5 ) > 1

3.聚合,将存在关键词的所有文章id存储到关键词表

由于数据库的sql like太慢了,而且太卡了,所有我就用sphinx

PHP聚合代码:


<?php
echo '<meta http-equiv="refresh" content="1"/>';
require('../e/class/connect.php');        //引入数据库配置文件和公共函数文件
require('../e/class/db_sql.php');        //引入数据库操作文件
require ( "sphinxapi.php" );            //引入sphinx api文件
//配置sphinx
$cl = new SphinxClient ();
$host = "127.0.0.1";
$port = 9312;
$index = "article";
$cl->SetServer ( $host, $port );
$cl->SetConnectTimeout ( 1 );
$cl->SetArrayResult ( true );
$cl->SetLimits(0, 10, 1000);
//翻页配置
$file = "search.txt";
$num = 1000;
if(file_exists($file)){
    $page_num = file_get_contents($file);
}else{
    $page_num = 0;
}
$page_id = $page_num*$num;

$link=db_connect();                //连接MYSQL
$empire=new mysqlquery();        //声明数据库操作类
$sql=$empire->query("SELECT id,title FROM `phome_keywords` ORDER BY `id` ASC  limit {$page_id},{$num}");
while($r=$empire->fetch($sql))        //循环获取查询记录
{
    $res = $cl->Query ( $r['title'], $index );
    // print_r($res);
    if($res['total'] > 2){
        foreach ($res['matches'] as $v1){
            $sql_data.= $v1['id'] . ",";
        }
        $sql_data =rtrim($sql_data,",");
        if(!empty($sql_data)){
            $empire->query("UPDATE `phome_keywords` SET `keyid` = '{$sql_data}' WHERE `phome_keywords`.`id` = {$r['id']};");
        }
    }
    echo "本次聚合id".$r['id']."<br>";
}
$page_num++;
file_put_contents($file,$page_num);
db_close();                        //关闭MYSQL链接
$empire=null;                        //注消操作类变量
?>

搞定!目前再去调用,那么就更相关了!

© 版权声明
THE END
喜欢就支持一下吧
点赞15
评论 抢沙发

请登录后发表评论

    暂无评论内容