[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中文


See also