帝国cms相关搜索调用优化

2023-11-04 0 842

帝国里面,我有一个新想法,增加一个表,存储所有文章的关键词,并将有关文章的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;                        //注消操作类变量
?>
搞定!目前再去调用,那么就更相关了!

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

1、如非特殊说明,本站对本文提供的代码或者素材不拥有任何权利,其版权归原著者拥有。
2、以上提供的代码或者素材均为作者提供和网友推荐收集整理而来,仅供学习和研究使用。
3、如有侵犯你版权的,请来信(邮箱:admin@mail.52muban.com)指出,核实后,本站将立即改正。
4、如有链接无法下载、失效或广告,请点击下面的报错或者联系我们处理!
5、以上资源售价只是赞助,不代表代码或者素材本身价格。收取费用仅维持本站的日常运营所需!
6、本站所有资源、教程、源码,不得用于非法站点及用途,后果自负!本站不为非法站点提供任何服务。

我爱模板网 帝国cms教程 帝国cms相关搜索调用优化 https://www.52muban.com/129317.html

常见问题
  • 我们承诺演示效果图均和网站一模一样,如有不同,全额退款,并且我们的模板和数据都没有留后门,请放心使用。
查看详情
  • 本站所有源码版权归原作者所有,我爱模板网提供的源码只能用于学习研究,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。
查看详情
发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务

© 2022 我爱模板网- 52muban.com . Powered by WordPress. All rights reserved 网站地图 粤ICP备2020135806号
本站由 腾讯云 提供CDN加速/云服务