最新公告
  • 欢迎您光临站长源码网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • 帝国cms相关搜索调用优化

    正文概述 管理员   2024-04-10   132

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

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

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

    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_sq l.php');        //引入数据库操作文件
    $link=db_connect();                //连接MYS Q L
    $empire=new mysq lquery();        //声明数据库操作类
    
    // 参数配 置
    $num = 10000;     //每次修改多少条数据
    // 获取页数
    $file = "ktabe.txt";
    if(file_exists($file)){
        $page_num = file_get_contents($file);
    }else{
        $page_num = 0;
    }
    $page_id = $page_num*$num;
    $sq l=$empire->query("select id,keyboard from {$dbtbpre}ecms_news where `keyboard` != '22' or `keyboard` != ''  limit {$page_id},{$num}"); 
    //查询新闻表最新10条记录
    while($r=$empire->fetch($sq l))        //循环获取查询记录
    {
    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();                        //关闭MYS Q L链接
    $empire=null;                        //注消操作类变量
    ?>

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

    
    
    
    <?php
    // echo '<meta http-equiv="refresh" content="2"/>';        // 自动跳 转
    require('../e/class/connect.php');        //引入数据库配 置文件和公共函数文件
    require('../e/class/db_sq l.php');        //引入数据库操作文件
    $link=db_connect();                //连接MYS Q L
    $empire=new mysq lquery();        //声明数据库操作类
    
    $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);
        $sq l.= "(null,'".md5($v)."', '{$v}', ''),";
        // echo $sq l;
        if($i>=100){
            $sq l = rtrim($sq l,',');
            $empire->query("INSERT INTO `{$dbtbpre}keywords` (`id`,`md5`, `title`, `keyid`) VALUES $sq l;");
            $sq l = '';
            $i=1;
        }
        $i++;
    }
    $sq l = rtrim($sq l,',');
    $empire->query("INSERT INTO `{$dbtbpre}keywords` (`id`,`md5`, `title`, `keyid`) VALUES $sq l;");
    
    db_close();                        //关闭MYS Q L链接
    $empire=null;                        //注消操作类变量
    ?>

    第三步,去重处理

    
    
    <?php
    
    require('../e/class/connect.php');        //引入数据库配 置文件和公共函数文件
    require('../e/class/db_sq l.php');        //引入数据库操作文件
    $link=db_connect();                //连接MYS Q L
    $empire=new mysq lquery();        //声明数据库操作类
    $sq l=$empire->query("SELECT id,md5, count( md5 ) FROM `phome_keywords` GROUP BY md5 HAVING count( md5 ) > 1 limit 10000");
    if(empty($sq l)){
        die;
    }else{
        echo '<meta http-equiv="refresh" content="2"/>';
    }
    while($r=$empire->fetch($sq l))        //循环获取查询记录
    {
        $empire->query("DELETE FROM `phome_keywords` WHERE `id` = {$r['id']};\n");
        echo $r['id']."  ";
    }
    
    echo "两秒后进行第二次删除";
    
    db_close();                        //关闭MYS Q L链接
    $empire=null;                        //注消操作类变量
    ?>

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

    去重主要用到的sq l:

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

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

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

    PHP聚合代码:

    
    <?php
    echo '<meta http-equiv="refresh" content="1"/>';
    require('../e/class/connect.php');        //引入数据库配 置文件和公共函数文件
    require('../e/class/db_sq l.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();                //连接MYS Q L
    $empire=new mysq lquery();        //声明数据库操作类
    $sq l=$empire->query("SELECT id,title FROM `phome_keywords` ORDER BY `id` ASC  limit {$page_id},{$num}");
    while($r=$empire->fetch($sq l))        //循环获取查询记录
    {
        $res = $cl->Query ( $r['title'], $index );
        // print_r($res);
        if($res['total'] > 2){
            foreach ($res['matches'] as $v1){
                $sq l_data.= $v1['id'] . ",";
            }
            $sq l_data =rtrim($sq l_data,",");
            if(!empty($sq l_data)){
                $empire->query("UPDATE `phome_keywords` SET `keyid` = '{$sq l_data}' WHERE `phome_keywords`.`id` = {$r['id']};");
            }
        }
        echo "本次聚合id".$r['id']."<br>";
    }
    $page_num++;
    file_put_contents($file,$page_num);
    db_close();                        //关闭MYS Q L链接
    $empire=null;                        //注消操作类变量
    ?>

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


    站长源码网 » 帝国cms相关搜索调用优化

    发表评论

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    支付宝支付
    微信支付
    余额支付
    ×
    微信扫码支付 0 元