1. 程式人生 > >sphinx全文搜尋在windows下安裝與使用方法

sphinx全文搜尋在windows下安裝與使用方法

sphinx-for-chinese的使用方法將使用 sphinx-for-chinese-2.2.1-dev-r4311-win32 為例子,目前我只找到最新的是這個版本2013.11.09釋出。
下載地址:http://sphinxsearchcn.github.io/


下載完後解壓出來得到以下檔案

將bin目錄與及所有檔案複製到你喜歡的安裝目錄,比如D盤或E盤,這裡我放到D盤sphinx-for-chinese資料夾(名字任意,你可以取別的英文名)
然後在剛才的sphinx-for-chinese目錄下建一個etc資料夾並複製 sphinx.conf.in 到剛才建立的etc目錄中,然後將sphinx.conf.in重新命名成sphinx.conf。最終我的D盤sphinx-for-chinese目錄檔案結構如下:



現在將 sphinx-for-chinese 安裝成windows服務程式,這樣系統啟動時會自行執行sphinx-for-chinese。
1.開啟Windows的CMD窗體,即命令列提示符窗體(位置:開始選單 -》 所有程式 -》附件),記得要用管理員身份執行。(在圖片上點右鍵就可以用管理員身份執行)。


在CMD視窗中輸入以下字串,記得你安裝的目錄和我這不一樣是要變的。
D:\sphinx-for-chinese\bin\searchd --install --config D:\sphinx-for-chinese\etc\sphinx.conf --servicename sphinx-cn

--servicenamesphinx-cn 這一段大家看好,--servicename後面可以是你自己想要的英文名稱。


刪除服務的命令是:D:\sphinx-for-chinese\bin\searchd --delete  --servicename sphinx-cn

2. 現在,來看看剛才的服務有沒有安裝成功。桌面上 找到 “我的電腦” 或 “計算機” 這個圖示,然後在上面右鍵會彈出一個選單。點”管理“選單後就會出現“伺服器管理器”介面。


“伺服器管理器”介面中,找到並展開“配置”就能看到有一個“服務” 呢,然後點這個服務,在右邊就會出現一個大列表。


在右邊列表中,看看有沒有一個叫 sphinx-cn 名稱的服務,如果有,就說明安裝是成功的,但不一定代表這個服務在執行。

大家看,沒有執行,估計是執行不起來,雙擊,開啟看看,如下圖。



我們看到,啟動型別是“自動”,但操作狀態是:已停止。大家可以點選 “啟動“ 按鈕,看能不能啟動,如果能啟動,那就恭喜你,當目前為止我這是不能啟動的。需要一些配置才能啟動。

先在 sphinx-for-chinese 目錄下新建data資料夾和一個log資料夾,一會要用到,名稱可以任意(用英文或拼音命名),但後面填寫必須和這一樣。
在cmd窗體中,輸入以下命令,看出現什麼資訊,從而排除為什麼上面的服務啟動不了。
D:\sphinx-for-chinese\bin\searchd  --config D:\sphinx-for-chinese\etc\sphinx.conf

上面顯示 建立pid檔案時找不到檔案或目錄。接下來要做的是在sphinx.conf檔案中查詢 @[email protected]/log/searchd.pid  找到後修改成
pid_file        = D:/sphinx-for-chinese/log/searchd.pid
接著再執行剛才的cmd命令,在CMD窗體上按一下鍵盤向上鍵,就會自動出現,之前輸入的命令。
D:\sphinx-for-chinese\bin\searchd  --config D:\sphinx-for-chinese\etc\sphinx.conf

出現如下提示,和剛才一樣,搜尋字串 @[email protected]/log/searchd.log ,然後修改。

l修改前:log            [email protected]@/log/searchd.log
修改後:log            = D:/sphinx-for-chinese/log/searchd.log

修改後儲存,然後繼續執行剛才的cmd命令,這個過程會很長,直到正常為止。以後直接貼圖了,不在說了。


l修改前:query_log        = @[email protected]/log/query.log
修改後:query_log        = D:/sphinx-for-chinese/log/query.log

我們接下來再試一下剛才的cmd命令,會發現提示和以前不一樣了,看下面的圖。

看起來正常了,但沒有索引,這個一會再說,先開啟windows 程序管理器,看看searchd.exe程序在不在.

看圖中顯示,searchd.exe已經運行了,我們強行結束這個程序吧(結束程序就不用我說了吧),改用服務啟動試試。

在伺服器管理器介面中,找到sphinx-cn並雙擊這個服務,會彈出一個小窗體,上面有個啟動按鈕,點選“啟動”按鈕即可,最終效果如下。


好了,當目前為止,初步安裝成功,接下來要開啟sphinx.conf並進行一些配置.

開啟sphinx.conf 並替換所有 @[email protected]/data/   字串為 D:/sphinx-for-chinese/data/ 然後儲存。


然後,停止剛才 sphinx-cn 服務,再用cmd執行一下
D:\sphinx-for-chinese\bin\searchd  --config D:\sphinx-for-chinese\etc\sphinx.conf
看有沒有錯誤資訊。

從圖中可以看出,只差沒有索引了,在工作管理員中,結束searchd.exe程序,然後對
sphinx.conf進行設定,這裡將使用我的資料庫表為例,大家可以修改成自己的。

source src1 這裡src1可以改名,改名後其它地方用到src1是就得和這個一樣
配置資料庫資訊
type            = mysql
    sql_host        = localhost
    sql_user        = test
    sql_pass        =123456
    sql_db            = www.panshy.com
    sql_port        = 3306    # optional, default is 3306


以下資訊,配置檔案中沒有,就自己加上

找到 sql_query_pre            = SET NAMES utf8 去掉前面的 #號
sql_query_info_pre      = SET NAMES utf8
sql_query_info            = SELECT * FROM www_panshy_com_ecms_pansharticle  WHERE id=$id
\
sql_query                = SELECT id, newstime AS date_added, title, newstext, titleurl, id as msgid, classid, userid,username,username as softtype,username as filesize, 1983  as dbtype  FROM  www_panshy_com_ecms_pansharticle
                                                              #sql_query第一列id需為整數

修改完後,儲存,然後在cmd窗體中執行,以下命令進行索引。
D:\sphinx-for-chinese\bin\indexer.exe  --config D:\sphinx-for-chinese\etc\sphinx.conf --all
正常的話是下面這樣子


data目錄下生成了一些檔案,如下圖



最後在cmd中執行D:\sphinx-for-chinese\bin\searchd  --config D:\sphinx-for-chinese\etc\sphinx.conf 再次檢視效果,正常的圖:


到目前為止,sphinx-for-chinese基本安裝配置完成。接下來就是整合中文分詞啦.
下載xdict_1.1.tar.gz (原文連結中有下載)

 



解壓到 D:\sphinx-for-chinese\etc目錄得到一個xdict_1.1.txt檔案。


在cmd窗體中,執行以下命令進行轉換。
d:\sphinx-for-chinese\bin\mkdict D:\sphinx-for-chinese\etc\xdict_1.1.txt D:\sphinx-for-chinese\etc\xdict

得到一個xdict檔案



修改sphinx.conf索引配置檔案
查詢 charset_type        = sbcs 然後刪除掉或註釋掉這行
新增以下兩項
    charset_type = utf-8
    chinese_dictionary = D:/sphinx-for-chinese/etc/xdict





至此,完成中文支援配置。

以上如果出現index rt錯誤,請將配置檔案中index rt項刪除即可。
 

具體sphinx-for-chinese使用方法與sphinx英文版一樣,可以參考sphinx官方網站的使用者手冊。

 

原文連結:http://www.panshsoft.net/thread-3-1-1.html

http://www.panshy.com/articles/201608/dev-2752.html


以下引用sphinx-for-chinese官方原文

http://sphinxsearchcn.github.io/

3.一些注意事項
sphinx-for-chinese只支援UTF-8編碼,資料來源輸出資料時請做轉換,使用MySQL時一般需要新增"SET NMAES utf8"語句。使用xmlpipe時,需要注意兩點:一個是XML中儘可能使用CDATA標籤,以避免特殊字元影響xml解析;另一個是sphinx配置中啟用xmlpipe_fixup_utf8=1選項,以儘可能的避免因非法UTF-8字串引起解析錯誤。
若需要檢查中文分詞支援是否啟用,請使用search命令,例子如下:

./search -c ../etc/sphinx.conf 分享身邊的精彩
sphinx-for-chinese 2.1.0-dev (r3006)
Copyright (c) 2008-2011, sphinx-search.com

using config file '../etc/sphinx.conf'...
index 'test1': query '分享身邊的精彩 ': returned 0 matches of 0 total in 0.000 sec

words:
1. '分享': 6 documents, 7 hits
2. '身邊': 26 documents, 38 hits
3. '的': 5344 documents, 178743 hits
4. '精彩': 5 documents, 6 hits

可以看到words中列出了各個中文單詞,說明中文分詞啟用成功。

出現亂碼時,請檢查資料來源的編碼是否為UTF-8,程式API中的呼叫是否為UTF-8,若為命令列測試,請檢查終端環境是否為UTF-8。windows的命令列環境為GBK,若在windows的命>令行下進行測試,請注意輸入資料的編碼。

如果資料來源不是MySQL,而是oracle、純文字或者其他資料來源,可以採用xmlpipe的方式進行索引。具體方法是採用容易快速開發的語言,如PHP,Python,Ruby或者Lua(C,C++等當然也可以)等讀取資料來源,然後按照既定格式輸出XML格式的資料,供sphinx讀取。99.9%的情況下sphinx是可以索引任何資料的,不需要額外的低層處理。

4.中文搜尋優化對中文進行全文檢索時,一般需要進行中文分詞(segmentation)。中文分詞的過程,一般叫做tokenize,也就是將一段文字分成多個token,索引的時候對每個token進行倒排索引(inverted index)。中文與拉丁語系不同,例如英文單詞之間用空格做區分,而中文沒有明顯的單詞分隔,這就需要演算法對中文字串進行分詞,而分詞的精確度就會影響中文搜尋的效果。舉個例子,“研究生命起源”如果分成“研究生”“命”“起源”,用“研究”一詞是搜尋不到的,用“生命”也搜尋不到;如果分成“研究”“生命”“起源”,則用“研究”和“生命”都可以搜尋到。同理,如果“上海市”被分成“上海”“市”,用“上海”是搜尋不到的。

為了提高搜尋效果,一般可以:

提高分詞精度。這個一般與分詞演算法有關,而現在常用的基於詞典的分詞演算法在分詞精度上差別不大(不會有數量級的差別)。另外可以對詞典進行調整,比如針對醫藥類網站,可以在詞典中新增醫藥類詞庫,針對特殊行業領域進行詞典優化,也可以提高分詞效果。關於詞庫,一般可以參考搜狗細胞詞庫。

採用同義詞、近義詞處理。這一部分主要是針對“餐廳”“餐館”或者“上海”“上海市”等同義或者近義處理。現在有些針對索引的分詞演算法採用多分的處理方法,比如將“上海市”分為“上海市”“上海”“市”,這樣“上海市”“上海”都可以搜尋到,但這樣會增加token數量,增加索引資料,影響搜尋效率,並且單純靠演算法對多分的處理粒度很難控制;另外還有將同>義詞詞庫整合到全文檢索裡的做法,這樣會增加搜尋程式的複雜度,不利於升級和微調。這裡建議的做法是將同義詞、近義詞的處理放到搜尋外圍,即對使用者輸入的搜尋語句進行處理和轉換,利用sphinx的搜尋語法進行處理。具體做法,可以整理一份同義詞、近義詞的詞庫,利用記憶體型資料庫儲存,作成daemon或者web service的介面,對使用者的搜尋輸>入進行預處理,不僅開發成本低,速度快,而且模組化高,容易調整,利於升級。
5.搜尋效能優化以及高可用容錯叢集搭建當索引資料過大或者訪問量過大時,可以:

對索引資料進行分割槽,這一部分與資料庫拆表十分類似。即把資料水平或者垂直分割槽,並在應用程式裡做一些調整,不同的搜尋請求,分配到不同的索引。這種做法的思路,還是儘可能的減少單個索引資料塊(index data block)的大小,進而減少每一次請求所需掃描資料的大小,提高響應時間。

合理的更新策略。根據更新頻率,採用main+delta的兩層處理或者main+today+delta的三層處理,也可以減少更新負擔,提高索引資料的更新速度。這一部分通常需要具體問題具體分析。

採用分散式處理,即將資料水平分割槽,分佈在多臺機器上。這一部分可以參考http://sphinxsearch.com/docs/2.0.2/distributed.html

高可用和容錯處理。一個是採用replication的處理方法,即一臺機器作為master負責索引更新,不接受外部請求,另外多臺機器執行sphinx例項,作為slave接受外部請求。master通過inotify和rsync更新slave上的索引資料,外部請求根據演算法分配到多個slave上,實現負載均衡和容錯處理。同時,還可以利用HAProxy和VRRP實現高可用性和容錯叢集的>搭建。另外一個方法,是採用sphinx自帶的分散式處理方法,並結合heartbeat或者VRRP實現容錯處理。