[PHP] FreeBSD Sphinx 繁體中文全文檢索 on PHP

sphinx 最近想說幫之前替代役單位來把全文檢索的中文部份搞定,所以找了一些全文檢索的 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 的介紹,包含了 mnoGoSearchSphinx — Sphinx Client、Swish — Swish Indexing,可以利用 pecl 來安裝 Sphinx,目前版本:0.9.9-rc1。 1. FreeBSD ports 安裝:
cd /usr/ports/textproc/sphinxsearch-devel; make install clean
#
# 把 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 指令安裝:
pecl install sphinx
3.接下來修改 php.ini 加入:
extension=sphinx.so
不過你也可以不用裝 sphinx client 的部份,因為官網友提供 php 的 sphinx Class 讓您使用,你打開了 sphinx.so 就會衝突重複定義。 4. 修改 /usr/local/etc/sphinx.conf 設定檔,那底下是我目前設定:
source src1
{
	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
	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 "臺灣"
sphinx_search (by appleboy46) 7. 架設 sphinx 伺服器:
#
# 建立 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中文
  • Pingback: 網站製作學習誌 » [Web] 連結分享()

  • Pingback: [教學] 加入 Sphinx 繁體中文全文檢索 on CodeIgniter | 小惡魔 - 電腦技術 - 生活日記 - 美食介紹 - AppleBOY()

  • Johnny

    不好意思
    請問一下 FreeBSD Sphinx 繁體中文檢索
    與Lucene 的功能一樣嗎?
    謝謝!!!

  • 我沒有使用過 Lucene,所以這部份沒辦法回答你,不好意思

  • Johnny

    不好意思
    那請問FreeBSD Sphinx 程式碼的功能可以當成搜尋引擎的功能來用嗎?
    謝謝!!!

  • Johnny

    不好意思
    請問一下 FreeBSD Sphinx 繁體中文檢索 程式碼的功能 可以用在網站上的搜尋引擎功能嗎?
    謝謝!!!

  • 可以的阿,那沒有問題喔,他有提供多種程式的 api。

  • Johnny

    不好意思
    請問一下 FreeBSD Sphinx 繁體中文檢索 程式的API
    可以套用到JSP裡面嗎?

    謝謝!!!

  • jay

    您好:
    想請教幾個問題:
    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

  • ccg

    您好,有二個問題想請教:
    1. 搜尋一個名詞時,比如說「斯芬克斯」時,sphinx會拆成「斯」、「芬」、「克」這三個字來列舉結果。是否有辦法能強制sphinx以「斯芬克斯」為單一關鍵字來查尋?

    2. 承上,如果有辦法能強制sphinx以「斯芬克斯」為單一關鍵字來查尋的話,假設有一文章裡的內容如下:
    斯芬克斯
    「斯芬克斯」一詞的中間被page這個tag所截斷,那就查不到了(這是假設1.是可以辦到的情形之下)。是否有辦法把page這個標籤忽略掉?