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服務重啟等等之後,便可正常(關鍵是有時候這些操作都搞過一遍,還是不行,搞幾次卻好了,灰常的鬱悶)