coreseek實戰(四):php介面的使用,完善php指令碼程式碼

樑子很威武發表於2016-11-22

coreseek實戰(四):php介面的使用,完善php指令碼程式碼

在上一篇文章 coreseeek實戰(三)中,已經能夠正常搜尋到結果,這篇文章主要是把 index.php 檔案程式碼寫得相對完整一點點(過濾、權重設定等等很多設定仍然沒有使用),同時記錄一下在測試過程中出現的問題。

index.php程式碼稍微完善

複製程式碼
<html>
<head>
<meta http-equiv="content-type" content="text/html;charset=gbk" />
<title>coreseek中文全文搜尋在php程式中的應用</title>
</head>
<body>
<h3><font color="blue">coreseek全文搜尋在php程式中應用</font></h3>
<form action="index.php" method="post">
輸入搜尋的關鍵詞:<input type="text" name="keyword" size="30" />
<input type="submit" name="sub" value="搜尋" />
</form>
<hr />
<?php
echo "<pre />";
#引入介面檔案,其實你懂的,就是一個類
require_once('sphinxapi.php');
if(isset($_POST['sub']) && $_POST['keyword'] != ''){
    $keyword = trim($_POST['keyword']);    //接收關鍵詞

    $sph = new SphinxClient();            //例項化 sphinx 物件
    $sph->SetServer('localhost',9312);    //連線9312埠
    $sph->SetMatchMode(SPH_MATCH_ANY);    //設定匹配方式
    $sph->SetSortMode(SPH_SORT_RELEVANCE);    //查詢結果根據相似度排序
    $sph->SetArrayResult(false);            //設定結果返回格式,true以陣列,false以PHP hash格式返回,預設為false
    
    /**
        *關鍵詞高亮顯示,以及產生文字摘要
        *BuildExcerpts($docs, $index, $words, $opts=array())
        *引數(包含文件內容的陣列,索引名,關鍵詞,高亮引數)
    **/
    $opts = array(
        "before_match"    => "<font color='red'>",    //關鍵詞高亮開始的html程式碼
        "after_match"    => "</font>",                //關鍵詞高亮結束的html程式碼
        "limit"            => 100,                        //摘要最多包含的符號數,預設256
        "around"        => 3,                        //每個關鍵詞左右選取的詞的數目,預設為5
    );
    
    $result = $sph->Query($keyword,'dede');//執行搜尋操作,引數(關鍵詞,[索引名])
    if(!array_key_exists('matches', $result)){    //如果沒有匹配結果,直接返回
        echo "搜尋無結果";
        return;
    }
    $arr_key = array_keys($result['matches']);    
    //獲取到匹配文章的ID
    $ids = implode(',',$arr_key);    //陣列轉成字串
    echo "<font color='blue'>按相關性排序id(結果數:",count($arr_key),"):</font>",$ids,"<hr />";
    
    //連線資料庫
    $mysqli = new Mysqli('localhost','root','123456','dedecmsv57gbksp1');
    $mysqli->query('set names gbk');
    $query = "select typeid,id,title,description from dede_archives where id in({$ids}) order by find_in_set(id,'{$ids}')";
    $res = $mysqli->query($query);
    echo "<table border='1' bordercolor='green' cellspacing='0'><tr><th>文章欄目</th><th>文章id</th><th>標題</th><th>描述</th></th></tr>";
    
    //搜尋詞沒有高亮顯示
    /* while($row = $res->fetch_assoc()){
        echo "<tr><td>",$row['typeid'],"</td><td>",$row['id'],"</td><td>",$row['title'],"</td><td>",$row['description'],"</td></tr>";
    } */
    
    //使用高亮顯示程式碼
    while($row = $res->fetch_assoc()){
        $result = $sph->BuildExcerpts($row, 'dede', $keyword, $opts);
        if(!$res){
            die("Error:".$sph->GetLastError());
        }
        echo "<tr><td>",$result[0],"</td><td>",$result[1],"</td><td>",iconv('utf-8','gbk',$result[2]),"</td><td>",iconv('utf-8','gbk',$result[3]),"</td></tr>";
    }
    
    echo "</table>";    
}
?>
複製程式碼

存在的問題總結:

(1)最嚴重的就是速度問題:使用高亮函式 buildExcerpts() 後,查詢速度變得異常之慢,需要10~20秒這樣;而不使用高亮,基本上 1 秒左右出結果。

(2)高亮之後,從資料庫讀取出來的內容為亂碼,只能做轉換。但資料庫編碼為gbk,且文件編碼、header設定的編碼也已經設定為gbk,不知道是哪裡的編碼出了問題。

(3)使用 php api 介面時,不解的是,有時候搜尋無結果;而折騰一下,索引重建、searchd服務重啟等等之後,便可正常(關鍵是有時候這些操作都搞過一遍,還是不行,搞幾次卻好了,灰常的鬱悶)

相關文章