帝国cms相关搜索调用优化
时间:2023年07月10日
/来源:网络
/编辑:佚名
帝国里面,我有一个新想法,增加一个表,存储所有文章的关键词,并将有关文章的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; //注消操作类变量
?>
搞定!目前再去调用,那么就更相关了!
这样做的好处就是可以再文章里面调用指定关键词的文章,可以抛开帝国原本自带的相关搜索聚合功能!
因为帝国原本自带的相关搜索聚合功能过于缓慢!(采用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; //注消操作类变量
?>
搞定!目前再去调用,那么就更相关了!
新闻资讯 更多
- 【帝国cms教程】帝国CMS模板变量$GLOBALS[navclassid]用法分析04-03
- 【帝国cms教程】鲜为人知帝国CMS内容页调用上一篇和下一篇的精华方法汇总04-03
- 【帝国cms教程】怎么快速找出帝国CMS数据库配置文件路径及迁移网站后修改技巧!04-03
- 【帝国cms教程】帝国CMS模板$GLOBALS[navclassid]用法详解04-03
- 【帝国cms教程】帝国cms 7.5版列表页分页样式修改笔记04-02
- 【帝国cms教程】解决帝国CMS搜索页面模板不支持灵动标签和万能标签的方法04-02
- 【帝国cms教程】帝国CMS只备份栏目和模板的方法04-02
- 【帝国cms教程】帝国CMS怎样删除清空数据库记录?04-02
热门文章
- 178Moban源码谈谈免费源码与收费源码的区别
- 2帝国CMS忘记后台登陆用户名、密码、认证码的解决方法
- 3帝国CMS(EmpireCMS) v7.5后台任意代码执行漏洞及具体修复方法
- 4帝国CMS和WordPress 哪个好?哪个适合建站?
- 5如何解决Discuz的密码错误次数过多请15分钟后登陆的问题
- 6帝国cms灵动标签取得内容和栏目链接地址
- 7emlog pro 注册码“开心”教程(如果有一天,emlog官方版 或者 emlog免费版 跑路了,那用户怎么办?)
- 8织梦CMS在nginx下设置伪静态方法(附nginx伪静态规则)
- 9帝国cms后台登录出现”您还未登录”怎么解决?
- 10帝国cms7.5忘记登录密码 和忘记登录认证码以及多次登录 失败被锁定解决办法