1. 程式人生 > >sphinx-for-chinese在windows下安裝與使用方法

sphinx-for-chinese在windows下安裝與使用方法

用戶 同時 另一個 優化 exe tty 正常 計算機 clas

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文件中查找 @CONFDIR@/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

出現如下提示,和剛才一樣,搜索字符串 @CONFDIR@/log/searchd.log ,然後修改。
技術分享圖片
l修改前:log =@CONFDIR@/log/searchd.log
修改後:log = D:/sphinx-for-chinese/log/searchd.log

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

技術分享圖片
l修改前:query_log = @CONFDIR@/log/query.log
修改後:query_log = D:/sphinx-for-chinese/log/query.log

我們接下來再試一下剛才的cmd命令,會發現提示和以前不一樣了,看下面的圖。
技術分享圖片
看起來正常了,但沒有索引,這個一會再說,先打開windows 進程管理器,看看searchd.exe進程在不在.
技術分享圖片
看圖中顯示,searchd.exe已經運行了,我們強行結束這個進程吧(結束進程就不用我說了吧),改用服務啟動試試。

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

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

打開sphinx.conf 並替換所有 @CONFDIR@/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實現容錯處理。

sphinx-for-chinese在windows下安裝與使用方法