[PHP] FreeBSD Sphinx 繁體中文全文檢索 on PHP
Jun 20th, 2009 by appleboy 參觀者:15,175Views 機器人:564Views

最近想說幫之前替代役單位來把全文檢索的中文部份搞定,所以找了一些全文檢索的 open source,挑了這套網路上評價還不錯的 Sphinx,目前 Sphinx 支援的作業系統如下:
- Linux 2.4.x, 2.6.x (various distributions)
- Windows 2000, XP
- FreeBSD 4.x, 5.x, 6.x
- NetBSD 1.6, 3.0
- Solaris 9, 11
- Mac OS X
雖然上面寫 FreeBSD 只支援到 6.X,但是我測試是在 FreeBSD 7.1-RELEASE-p6 的環境,所以相當 ok 的,底下是我安裝在 FreeBSD 的心得筆記,PHP 官網上面有支援 Search Engine Extensions 的介紹,包含了 mnoGoSearch、Sphinx — Sphinx Client、Swish — Swish Indexing,可以利用 pecl 來安裝 Sphinx,目前版本:0.9.9-rc1。
1. FreeBSD ports 安裝:
#
# 把 MySQL 勾選起來
2. 讓 php 支援 Sphinx 套件
# 先下載官方網站 Sphinx sphinx-0.9.8.1.tar.gz
wget http://www.sphinxsearch.com/downloads/sphinx-0.9.8.1.tar.gz
#
# 解壓縮之後進入 sphinx/api/libsphinxclient/
./buildconf.sh && ./configure && make install
做上面步驟是確保 pecl 安裝 sphinxclient 所需要的 library sphinxclient.c 或者是 sphinxclient.h,必須放在 /usr/local/include 裡面,最後就可以用 pecl 指令安裝:
3.接下來修改 php.ini 加入:
不過你也可以不用裝 sphinx client 的部份,因為官網友提供 php 的 sphinx Class 讓您使用,你打開了 sphinx.so 就會衝突重複定義。
4. 修改 /usr/local/etc/sphinx.conf 設定檔,那底下是我目前設定:
{
type = mysql
sql_host = localhost
sql_user = root
sql_pass = xxxxxxxxxxxxxxxxx
sql_db = dar
sql_port = 3306 # optional, default is 3306
sql_query_pre = SET NAMES utf8
sql_query = \
SELECT rid, groupNum, itemNum, itemName, volName, collecNum \
FROM th_series
sql_ranged_throttle = 0
sql_query_info = SELECT * FROM th_series WHERE rid=$id
}
source src1throttled : src1
{
sql_ranged_throttle = 100
}
index test1
{
source = src1
path = /var/db/sphinxsearch/data/test1
docinfo = extern
mlock = 0
morphology = none
min_word_len = 1
charset_type = utf-8
charset_table = U+FF10..U+FF19->0..9, 0..9, U+FF41..U+FF5A->a..z, U+FF21..U+FF3A->a..z,A..Z->a..z, a..z, U+0149, U+017F, U+0138, U+00DF, U+00FF, U+00C0..U+00D6->U+00E0..U+00F6, U+00E0..U+00F6, U+00D8..U+00DE->U+00F8..U+00FE, U+00F8..U+00FE, U+0100->U+0101, U+0101, U+0102->U+0103, U+0103, U+0104->U+0105, U+0105, U+0106->U+0107, U+0107, U+0108->U+0109, U+0109, U+010A->U+010B, U+010B, U+010C->U+010D, U+010D, U+010E->U+010F, U+010F, U+0110->U+0111, U+0111, U+0112->U+0113, U+0113, U+0114->U+0115, U+0115, U+0116->U+0117, U+0117, U+0118->U+0119, U+0119, U+011A->U+011B, U+011B, U+011C->U+011D, U+011D, U+011E->U+011F, U+011F, U+0130->U+0131, U+0131, U+0132->U+0133, U+0133, U+0134->U+0135, U+0135, U+0136->U+0137, U+0137, U+0139->U+013A, U+013A, U+013B->U+013C, U+013C, U+013D->U+013E, U+013E, U+013F->U+0140, U+0140, U+0141->U+0142, U+0142, U+0143->U+0144, U+0144, U+0145->U+0146, U+0146, U+0147->U+0148, U+0148, U+014A->U+014B, U+014B, U+014C->U+014D, U+014D, U+014E->U+014F, U+014F, U+0150->U+0151, U+0151, U+0152->U+0153, U+0153, U+0154->U+0155, U+0155, U+0156->U+0157, U+0157, U+0158->U+0159, U+0159, U+015A->U+015B, U+015B, U+015C->U+015D, U+015D, U+015E->U+015F, U+015F, U+0160->U+0161, U+0161, U+0162->U+0163, U+0163, U+0164->U+0165, U+0165, U+0166->U+0167, U+0167, U+0168->U+0169, U+0169, U+016A->U+016B, U+016B, U+016C->U+016D, U+016D, U+016E->U+016F, U+016F, U+0170->U+0171, U+0171, U+0172->U+0173, U+0173, U+0174->U+0175, U+0175, U+0176->U+0177, U+0177, U+0178->U+00FF, U+00FF, U+0179->U+017A, U+017A, U+017B->U+017C, U+017C, U+017D->U+017E, U+017E, U+0410..U+042F->U+0430..U+044F, U+0430..U+044F, U+05D0..U+05EA, U+0531..U+0556->U+0561..U+0586, U+0561..U+0587, U+0621..U+063A, U+01B9, U+01BF, U+0640..U+064A, U+0660..U+0669, U+066E, U+066F, U+0671..U+06D3, U+06F0..U+06FF, U+0904..U+0939, U+0958..U+095F, U+0960..U+0963, U+0966..U+096F, U+097B..U+097F, U+0985..U+09B9, U+09CE, U+09DC..U+09E3, U+09E6..U+09EF, U+0A05..U+0A39, U+0A59..U+0A5E, U+0A66..U+0A6F, U+0A85..U+0AB9, U+0AE0..U+0AE3, U+0AE6..U+0AEF, U+0B05..U+0B39, U+0B5C..U+0B61, U+0B66..U+0B6F, U+0B71, U+0B85..U+0BB9, U+0BE6..U+0BF2, U+0C05..U+0C39, U+0C66..U+0C6F, U+0C85..U+0CB9, U+0CDE..U+0CE3, U+0CE6..U+0CEF, U+0D05..U+0D39, U+0D60, U+0D61, U+0D66..U+0D6F, U+0D85..U+0DC6, U+1900..U+1938, U+1946..U+194F, U+A800..U+A805, U+A807..U+A822, U+0386->U+03B1, U+03AC->U+03B1, U+0388->U+03B5, U+03AD->U+03B5, U+0389->U+03B7, U+03AE->U+03B7, U+038A->U+03B9, U+0390->U+03B9, U+03AA->U+03B9, U+03AF->U+03B9, U+03CA->U+03B9, U+038C->U+03BF, U+03CC->U+03BF, U+038E->U+03C5, U+03AB->U+03C5, U+03B0->U+03C5, U+03CB->U+03C5, U+03CD->U+03C5, U+038F->U+03C9, U+03CE->U+03C9, U+03C2->U+03C3, U+0391..U+03A1->U+03B1..U+03C1, U+03A3..U+03A9->U+03C3..U+03C9, U+03B1..U+03C1, U+03C3..U+03C9, U+0E01..U+0E2E, U+0E30..U+0E3A, U+0E40..U+0E45, U+0E47, U+0E50..U+0E59, U+A000..U+A48F, U+4E00..U+9FBF, U+3400..U+4DBF, U+20000..U+2A6DF, U+F900..U+FAFF, U+2F800..U+2FA1F, U+2E80..U+2EFF, U+2F00..U+2FDF, U+3100..U+312F, U+31A0..U+31BF, U+3040..U+309F, U+30A0..U+30FF, U+31F0..U+31FF, U+AC00..U+D7AF, U+1100..U+11FF, U+3130..U+318F, U+A000..U+A48F, U+A490..U+A4CF,
ngram_chars = U+4E00..U+9FBF, U+3400..U+4DBF, U+20000..U+2A6DF, U+F900..U+FAFF, U+2F800..U+2FA1F, U+2E80..U+2EFF, U+2F00..U+2FDF, U+3100..U+312F, U+31A0..U+31BF, U+3040..U+309F, U+30A0..U+30FF, U+31F0..U+31FF, U+AC00..U+D7AF, U+1100..U+11FF, U+3130..U+318F, U+A000..U+A48F, U+A490..U+A4CF
min_infix_len = 1
ngram_len = 1
html_strip = 0
}
index dist1
{
type = distributed
local = test1
local = test1stemmed
agent = localhost:3313:remote1
agent = localhost:3314:remote2,remote3
agent_connect_timeout = 1000
agent_query_timeout = 3000
}
indexer
{
mem_limit = 256M
}
searchd
{
listen = 0.0.0.0
listen = 3312
log = /var/log/searchd.log
query_log = /var/log/sphinx-query.log
read_timeout = 5
client_timeout = 300
max_children = 300
pid_file = /var/run/sphinxsearch/searchd.pid
max_matches = 10000
}
注意:charset_type 必須改為 utf-8,然後必須加上 charset_table 跟 ngram_chars 這樣中文檢索就沒有問題了,可以參考 ihower 這篇:全文搜尋 Sphinx on Rails,官方討論區有人問過:full-text searching in Chinese document. 此篇務必看過,對中文搜尋有很大的幫助。
5. 建立索引:
# 針對 test1 索引
/usr/local/bin/indexer test1
#
# 全部索引
/usr/local/bin/indexer --all
6. 查詢:
# -i 針對 test1 索引搜尋,-l 1 顯示一筆資料
search -i test1 -l 1 "臺灣"
# 建立 4567 port 索引伺服器
searchd --console --nodetach --port 4567 -i test1
listen 0.0.0.0 跟 port 4567,提供 php 做查詢動作。詳細更多設定可以參考 Sphinx 0.9.9 reference manual 或者是中文:sphinx search中文


[...] [PHP] FreeBSD Sphinx 繁體中文全文檢索 on PHP [...]
[...] Sphinx 一篇針對繁體中文檢索的教學,大家可以先去參考看看,把 Sphinx 服務架設起來,在搭配 CodeIgniter MVC [...]
不好意思
請問一下 FreeBSD Sphinx 繁體中文檢索
與Lucene 的功能一樣嗎?
謝謝!!!
我沒有使用過 Lucene,所以這部份沒辦法回答你,不好意思
不好意思
那請問FreeBSD Sphinx 程式碼的功能可以當成搜尋引擎的功能來用嗎?
謝謝!!!
不好意思
請問一下 FreeBSD Sphinx 繁體中文檢索 程式碼的功能 可以用在網站上的搜尋引擎功能嗎?
謝謝!!!
可以的阿,那沒有問題喔,他有提供多種程式的 api。
不好意思
請問一下 FreeBSD Sphinx 繁體中文檢索 程式的API
可以套用到JSP裡面嗎?
謝謝!!!
http://sphinxsearch.com/docs/current.html#about
有支援,請安心使用
您好:
想請教幾個問題:
1.此軟體是否可以搜尋整個HD內的檔案(doc,odf….等),是否需要先建立DB?
2.小弟照您的說明去設定最後執行的時候會出現類似這樣的訊息:
using config file ‘/usr/local/etc/sphinx.conf’…
indexing index ‘test1′…
FATAL: failed to open /var/data/test1.spl: No such file or directory, will not index. Try –rotate option.
不知道是哪裡出錯,小弟想結合網頁搜尋Server的文件,可否請前指點一下.
3.我參考官網與您的說終於於安裝起來,不過看起來很大,看起來我漏掉很多,可否請前輩指點,小弟使用CentOS5.2
jay 的問題應該是因為你的 searchd 已經 run 起來了,官方的說明寫如果要動態更新 index 的話要多下一個 -rotate 的參數。
所以只要下indexer test1 –rotate 就可以順利更新 index
您好,有二個問題想請教:
1. 搜尋一個名詞時,比如說「斯芬克斯」時,sphinx會拆成「斯」、「芬」、「克」這三個字來列舉結果。是否有辦法能強制sphinx以「斯芬克斯」為單一關鍵字來查尋?
2. 承上,如果有辦法能強制sphinx以「斯芬克斯」為單一關鍵字來查尋的話,假設有一文章裡的內容如下:
斯芬克斯
「斯芬克斯」一詞的中間被page這個tag所截斷,那就查不到了(這是假設1.是可以辦到的情形之下)。是否有辦法把page這個標籤忽略掉?