使用PHP Sphinx建立高效的站內搜尋引擎

2021-09-07 19:46:31 字數 4862 閱讀 8967

1.為什麼要使用sphinx

假設你現在運營著乙個論壇,論壇資料已經超過100w,很多使用者都反映論壇搜尋的速度非常慢,那麼這時你就可以考慮使用sphinx了(當然其他的全文檢索程式或方法也行)。

2.sphinx是什麼

sphinx由俄羅斯人andrew aksyonoff 開發的高效能全文搜尋軟體包,在gpl與商業協議雙許可協議下發行。

全文檢索是指以文件的全部文字資訊作為檢索物件的一種資訊檢索技術。檢索的物件有可能是文章的標題,也有可能是文章的作者,也有可能是文章摘要或內容。

3.sphinx的特性

l  高速索引 (在**cpu上,近10 mb/秒);

l  高速搜尋 (2-4g的文字量中平均查詢速度不到0.1秒);

l  高可用性 (單cpu上最大可支援100 gb的文字,100m文件);

l  提供良好的相關性排名

l  支援分布式搜尋;

l  提供文件摘要生成;

l  提供從mysql內部的外掛程式式儲存引擎上搜尋

l  支援布林,短語, 和近義詞查詢;

l  支援每個文件多個全文檢索域(預設最大32個);

l  支援每個文件多屬性;

l  支援斷詞;

l  支援單位元組編碼與utf-8編碼;

4.

5.使用sphinx

我要使用sphinx需要做以下幾件事

1)        首先得有資料

2)        建立sphinx配置檔案

3)        生成索引

4)        啟動sphinx

5)        使用之(呼叫api或search.exe程式進行查詢)

第1件:(匯入資料)

第2件:(建立配置檔案)

接下來我們需要建立乙個sphinx的配置檔案 e:\coreseek\etc\mysql.conf,將其內容改為下面這些:

source mysql

index mysql

searchd

先講下這個配置檔案中每項的含義。

source mysql{} 定義源名稱為mysql,也可以叫其他的,比如:source ***{}

type  資料來源型別

sql_* 資料相關的配置,比如sql_host,sql_pass什麼的,這些不解釋鳥

sql_query 建立索引時的查詢命令,在這裡盡可能不使用where或group by,將where與groupby的內容交給sphinx,由sphinx進行條件過濾與groupby效率會更高,注意:select 的字段必須包括乙個唯一主鍵以及要全文檢索的字段,where中要用到的字段也要select出來

sql_query_pre 在執行sql_query前執行的sql命令, 可以有多條

sql_attr 以這個開頭的配置項,表示屬性字段,在where,orderby,groupby**現的字段要分別定義乙個屬性,定義不同型別的字段要用不同的屬性名,比如上面的sql_attr_timestamp就是時間戳型別。

index mysql{} 定義索引名稱為mysql,也可以叫其他的,比如:index ***{}

source 關聯源,就是source ***定義的。

path 索引檔案存放路徑,比如:e:/coreseek/var/data/mysql 實際存放在e:/coreseek/var/data/目錄,然後建立多個名稱為mysql字尾卻不同的索引檔案

charset_dictpath  指明分詞法讀取詞典檔案的位置,當啟用分詞法時,為必填項。在使用libmmseg作為分詞 庫時,需要確保詞典檔案uni.lib在指定的目錄下

charset_type 字符集,比如charset_type = zh_cn.gbk

searchd{} sphinx守護程序配置

listen 監聽埠

max_matches最大匹配數,也就是查詢的資料再多也只返回這裡設定的1000條

pid_file pid檔案路徑

log全文檢索日誌

query_log查詢日誌

好了,配置檔案就這樣,配置的引數還有很多,大家可以自己查文件。

第3件:(生成索引)

開始 -> 執行 -> 輸入cmd回車,開啟命令列工具

e:\coreseek\bin\indexer --config e:\coreseek\etc\mysql.conf --all

這一串東西其實就是呼叫indexer程式來生成所有索引

如果只想對某個資料來源進行索引,則可以這樣:e:\coreseek\bin\indexer --config e:\coreseek\etc\mysql.conf 索引名稱(索引名稱指配置檔案中所定義的)

執行命令後如果你沒看到fatal,error這些東西,那麼索引檔案就算生成成功了,比如我看到得就是

………省略………

using config file 'e:\coreseek\etc\mysql.conf'...

indexing index 'mysql'...

collected 4 docs, 0.0 mb

………省略………

第4件:(啟動sphinx)

同樣命令列下

e:\coreseek\bin\searchd --config e:\coreseek\etc\mysql.conf

執行後提示了一大堆東西

using config file 'e:\coreseek\etc\mysql.conf'...

listening on all inte***ces, port=9312

accepting connections

不用管這些鳥文是啥意思,反正sphinx是啟動好了。

現在有一串鳥文的這個命令列是不能關的,因為關了sphinx也就關了,如果覺得這樣不爽,可以將sphinx安裝成系統服務,在後台執行。

安裝系統服務只需在命令列中輸入以下命令

e:\coreseek\bin\searchd --config e:\coreseek\etc\mysql.conf --install

安裝之後記得啟動這個服務,不會啟動那我沒法,自己google。

第5步:(使用sphinx)

在web根目錄下建立乙個search目錄(當然不在根目錄也行,同樣目錄名也可以隨取),複製e:\coreseek\api\ sphinxapi.php檔案到search目錄(sphinxapi.php這個是sphinx官方提供的api),開始php程式的編寫。

在search目錄建立乙個檔案,名字叫啥都行,我管它叫index.php,其內容如下

<?php

include 'sphinxapi.php';  // 載入sphinx api

$sc = new sphinxclient(); // 例項化api

$sc->setserver('localhost', 9312); // 設定服務端,第乙個引數sphinx伺服器位址,第二個sphinx監聽埠

$res = $sc->query('sphinx', 'mysql'); // 執行查詢,第乙個引數查詢的關鍵字,第二個查詢的索引名稱,mysql索引名稱(這個也是在配置檔案中定義的),多個索引名稱以,分開,也可以用*表示所有索引。

print_r($res);

列印結果:

array

(………省略………

[matches] => array

([2] => array

([weight] => 2

[attrs] => array

([addtime] => 1282622004))

[4] => array

([weight] => 2

[attrs] => array

([addtime] => 1282622079))

)………省略………

)matches中就是查詢的結果了,但是彷彿不是我們想要的資料,比如titile,content欄位的內容就沒有查詢出來,根據官方的說明是sphinx並沒有連線到mysql去取資料,只是根據它自己的索引內容進行計算,因此如果想用sphinx提供的api去取得我們想要的資料,還必須以查詢的結果為依據,再次查詢mysql從而得到我們想要的資料。

查詢結果中鍵值分別表示

2唯一主鍵

weight權重

attrs sql_attr_*中配置

至此,搜尋引擎算是完成一大半了,剩下的大家可以自行完成。

比如:<?php

$ids    = array_keys($res['matches']); // 獲取主鍵

$ids = join(',', $ids);

$query  = mysql_query("select * from post where id in ()");

while($row = mysql_fetch_assoc($query))

sphinx的更多配置,程式的引數等,大家可以檢視sphinx的文件。

當你有事情忙的時候,你會覺得時間過得很快 很快。可能你會感覺有點累。但這是乙個人成功的歷程。請堅信,我一定會好好的。

更多

使用PHP Sphinx建立高效的站內搜尋引擎

本文摘自csdn樂知 草根 雜誌第四期 1.為什麼要使用sphinx 假設你現在運營著乙個論壇,論壇資料已經超過100w,很多使用者都反映論壇搜尋的速度非常慢,那麼這時你就可以考慮使用sphinx了 當然其他的全文檢索程式或方法也行 2.sphinx是什麼 sphinx由俄羅斯人andrew aks...

mysql建立高效索引 mysql建立高效索引分析

一 如何建立理想的索引?查詢頻繁度 區分度索引長度 覆蓋字段 1.1區分度 假設100萬使用者,性別基本上男 女各為50w,區分度就低。1.2長度小 索引長度直接影響索引檔案的大小,影響增刪改的速度,並間接影響查詢速度 占用記憶體多 1.3區分度高,長度小 如何讓區分度高,而長度小?可以針對列中的值...

建立高效專案團隊

不管是工作專案還是業餘專案,大多都需要乙個團隊來執行。如果你是單幹的,下面可以不用看了,認真幹活去吧,我知道你的時間很寶貴。如果需要乙個團隊來協作完成專案,那如何建立乙個高效運作的團隊就是重中之重的問題,這將直接影響的專案的成敗。乙個產品點子很重要,但是最重要的是執行團隊。沒有乙個高素質高效率的團隊...