施用PHP+Sphinx建立高效的站內搜尋引擎
最後更新:2016-06-13
來源:互聯網
上載者:User
使用PHP+Sphinx建立高效的站內搜尋引擎
1.為什麼要使用Sphinx
假設你現在運營著一個論壇,論壇資料已經超過100W,很多使用者都反映論壇搜尋的速度非常慢,那麼這時你就可以考慮使用Sphinx了(當然其他的全文檢索索引程式或方法也行)。
2.Sphinx是什麼
Sphinx由俄羅斯人Andrew Aksyonoff 開發的高效能全文檢索搜尋軟體包,在GPL與商業協議雙許可協議下發行。
全文檢索索引是指以文檔的全部文本資訊作為檢索對象的一種資訊檢索技術。檢索的對象有可能是文章的標題,也有可能是文章的作者,也有可能是文章摘要或內容。
3.Sphinx的特性
?高速索引 (在新款CPU上,近10 MB/秒);
?高速搜尋 (2-4G的文本量中平均查詢速度不到0.1秒);
?高可用性 (單CPU上最大可支援100 GB的文本,100M文檔);
?提供良好的相關排名
?支援分布式搜尋;
?提供文檔摘要產生;
?提供從MySQL內部的外掛程式式儲存引擎上搜尋
?支援布爾,短語, 和近義詞查詢;
?支援每個文檔多個全文檢索索引域(預設最大32個);
?支援每個文檔多屬性;
?支援斷詞;
?支援單位元組編碼與UTF-8編碼;
4.下載並安裝Sphinx
開啟網址http://www.coreseek.cn/news/7/52/ 找到適合自己的作業系統的版本,比如我是Windows那麼我就可以下載Coreseek Win32通用版本,Linux下可以下載源碼包,自己編譯安裝。這裡解釋下為什麼我們下載的程式叫Coreseek,Coreseek是基於Sphinx開發的一款軟體,對Sphinx做了一些改動,在中文方面支援得比Sphinx好,所以我們使用之。
下載完成後,將程式解壓到你想解壓的地方,比如我就想解壓到E盤根目錄,之後修改目錄名為Coreseek,大功告成Coreseek安裝完成了,安裝的目錄是在E:\coreseek\。
5.使用Sphinx
我要使用Sphinx需要做以下幾件事
1)首先得有資料
2)建立Sphinx設定檔
3)產生索引
4)啟動Sphinx
5)使用之(調用api或search.exe程式進行查詢)
第1件:(匯入資料)
我們建立測試所需要用到得資料庫、表以及資料,篇幅有限,這些在附件中都有,下載後匯入MySQL即可。
第2件:(建立設定檔)
接下來我們需要建立一個Sphinx的設定檔 E:\coreseek\etc\mysql.conf,將其內容改為下面這些:
source mysql
{
type= mysql
sql_host= localhost
sql_user= root
sql_pass=
sql_db= test
sql_port= 3306
sql_query_pre= SET NAMES utf8
sql_query= SELECT id,addtime,title,content FROM post
sql_attr_timestamp= addtime
}
index mysql
{
source= mysql
path= E:/coreseek/var/data/mysql
charset_dictpath= E:/coreseek/etc/
charset_type= zh_cn.utf-8
}
searchd
{
listen= 9312
max_matches= 1000
pid_file= E:/coreseek/var/log/searchd_mysql.pid
log= E:/coreseek/var/log/searchd_mysql.log
query_log= E:/coreseek/var/log/query_mysql.log
}
先講下這個設定檔中每項的含義。
source mysql{} 定義源名稱為mysql,也可以叫其他的,比如:source xxx{}
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 xxx{}
source 關聯源,就是source xxx定義的。
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 索引名稱(索引名稱指設定檔中所定義的)
--config,--all這些都是indexer程式的參數,想瞭解更多參數的朋友可以查看文檔
運行命令後如果你沒看到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 interfaces, port=9312
accepting connections
不用管這些鳥文是啥意思,反正Sphinx是啟動好了。
現在有一串鳥文的這個命令列是不能關的,因為關了Sphinx也就關了,如果覺得這樣不爽,可以將Sphinx安裝成系統服務,在後台運行。
安裝系統服務只需在命令列中輸入以下命令
e:\coreseek\bin\searchd --config e:\coreseek\etc\mysql.conf --install
安裝之後記得啟動這個服務,不會啟動那我沒法,自己google。