帝國裏面,我有一個新想法,增加一個表,存儲所有文章的關鍵詞,並將有關文章的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; //注消操作類變量
?>
搞定!目前再去調用,那麼就更相關了!