红穆笔记
首頁 程序筆記 帝國cms相關搜索調用優化
程序筆記 帝國cms

帝國cms相關搜索調用優化

帝国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;                        //注消操作類變量
?>

搞定!目前再去調用,那麼就更相關了!

微信赞赏

微信

支付宝赞赏

支付寶

✍️ 作者: 紅穆

網站管理員 · 感謝閱讀,更多精彩內容敬請關注

作者主頁 查看主頁 →

相關文章

帝国CMS数据库语句&amp;SQL语句格式

帝國CMS數據庫語句&amp;SQL語句格式 程序筆記 帝國cms

帝國CMS擴展SQL程序編寫介紹,帝國CMS數據庫語句&SQL語句格式基本範例:說明:下面例子都是以PHP文件放在系統根目錄爲基準。例1:連接MYSQL程序。(a.php)&lt;?php require('e/class/connect.php'); //引入數據庫配置文件和公共函數文件 requ…
👁 351
帝国CMS获取系统COOKIE变量函数getcvar()

帝國CMS獲取系統COOKIE變量函數getcvar() 程序筆記 帝國cms

取得系統COOKIE變量函數語法:getcvar($var,$ecms)說明:$var:爲變量名$ecms:0爲設置前臺COOKIE變量,1爲設置後臺COOKIE變量。此參數可省略,默認爲0。使用範例:getcvar('mlusername'),取得前臺登陸會員的用戶名getcvar('loginu…
👁 295
帝国CMS灵动标签调用字段大全

帝國CMS靈動標籤調用字段大全 程序筆記 帝國cms

將所有支持靈動標籤調用的字段收集歸類帝國CMS靈動標籤: [e:loop={欄目ID/專題ID,顯示條數,操作類型,只顯示有標題圖片,附加SQL條件,顯示排序}] 模板代碼內容 [/e:loop]調用時間:&lt;?=date('m-d',$bqr[newstime])?&gt; &lt;?=dat…
👁 3749

推薦閱讀

PHP 字符串分割后去重

PHP 字符串分割後去重 語言筆記 PHP

超級簡單的代碼:// 將關鍵詞拆分爲數組,去除重複項,再合併爲字符串 $uniqueKeywords = implode(',', array_unique(explode(',', $keywords)));常用於關鍵詞去重處理
👁 108
桂枝汤服用后,为什么会发热和发冷?

桂枝湯服用後,爲什麼會發熱和發冷? 業餘愛好 備忘筆記

桂枝湯桂枝湯的主要功效在於它的成分具有多種藥理作用,可以治療多種疾病。首先,桂枝湯中的桂枝可以溫通陽氣、扶助脾胃、解表發汗、散寒止痛等。它可以增強體內陽氣的活力,促進新陳代謝,增強免疫力,有助於預防感冒、瘧疾等寒熱病。其次,桂枝湯中的芍藥有活血化瘀的功效,可以改善血液循環,緩解痛經、月經不調等問題。…
👁 2142
中医里面,人正气的运行,厥阴,少阴,太阴,少阳,阳明,太阳,如果出现病邪入体,病邪进入的路线和相对应的身体状况是什么?

中醫裏面,人正氣的運行,厥陰,少陰,太陰,少陽,陽明,太陽,如果出現病邪入體,病邪進入的路線和相對應的身體狀況是什麼? 業餘愛好 備忘筆記

在中醫理論中,認爲人體正常運行需要保持正氣的平衡。正氣主要運行於人體的六經:厥陰、少陰、太陰、少陽、陽明、太陽。如果身體受到病邪侵入,根據中醫理論,病邪會依據不同的性質和方向,進入不同的經脈,並導致相應的身體狀況。以下是不同經脈病邪入侵的路線和相對應的身體狀況:厥陰經:病邪從足心進入,可引起口乾、咳…
👁 185