什麼是Sphinx/Coreseek
Sphinx是一個在GPLv2下分發的全文檢索引擎;Coreseek是一個可供企業使用的、基于Sphinx(可獨立于Sphinx原始版本運作)的中文全文檢索引擎,按照GPLv2協定發行,商業使用(例如, 嵌入到其他程式中)需要聯系我們以獲得商業授權。
一般而言,Sphinx是一個獨立的全文搜尋引擎;而Coreseek是一個支援中文的全文搜尋引擎,意圖為其他應用提供高速、低空間占用、高結果相關度的中文全文搜尋能力。Sphinx/Coreseek可以非常容易的與SQL資料庫和腳本語言內建。
目前系統内置MySQL和PostgreSQL 資料庫資料源的支援,也支援從管道标準輸入讀取入特定格式的XML資料。通過修改源代碼,使用者可以自行增加新的資料源(例如:其他類型的DBMS的原生支援)。在最新的版本中,使用者還可以使用Python腳本作為資料源來擷取任何已知世界和未知世界的資料,這極大的擴充了資料源的來源。
搜尋API支援PHP、Python、Perl、Rudy和Java,并且也可以用作MySQL存儲引擎。搜尋API非常簡單,可以在若幹個小時之内移植到新的語言上。
Sphinx 是SQL PhraseIndex的縮寫,但不幸的和CMU的Sphinx項目重名。
Coreseek http://www.coreseek.cn 為Sphinx在中國地區的使用者提供支援服務.
Sphinx http://sphinxsearch.com/
Sphinx/Coreseek 的特性
高速的建立索引(在當代CPU上,峰值性能可達到10MB/秒);
高性能的搜尋(在2 – 4GB 的文本資料上,平均每次檢索響應時間小于0.1秒);
可處理海量資料(目前已知可以處理超過100GB的文本資料, 在單一CPU的系統上可處理100 M 文檔);
提供了優秀的相關度算法,基于短語相似度和統計(BM25)的複合Ranking方法;
支援分布式搜尋;
提供文檔片段(摘要以及高亮)生成功能;
可作為MySQL的存儲引擎提供搜尋服務;
支援布爾、短語、詞語相似度等多種檢索模式;
文檔支援多個全文檢索字段(預設配置下,最大不超過32個);
文檔支援多個額外的屬性資訊(例如:分組資訊,時間戳等);
停止詞查詢;
支援單一位元組編碼和UTF-8編碼,以及對GBK和BIG5的完善支援;
支援英語、俄語詞詞幹化和Soundex,以便進行詞形學處理;
原生的MySQL支援(同時支援MyISAM 和InnoDB );
原生的PostgreSQL支援;
支援直接模拟為MySQL服務端運作;
支援MMSeg分詞引擎,使用者可自定義詞典;
Python資料源支援,得以擷取任何已知世界和未知世界的資料.
目前,Sphinx/Coreseek的釋出包包括如下軟體:
indexer: 用于建立全文索引;
search: 一個簡單的指令行(CLI) 的測試程式,用于測試全文索引;
searchd: 一個守護程序,其他軟體可以通過這個守護程序進行全文檢索;
sphinxapi: 一系列searchd 的用戶端API 庫,用于流行的Web腳本開發語言(PHP, Python, Perl, Ruby, Java).
spelldump: 一個簡單的指令行工具,用于從 ispell 或 MySpell (OpenOffice内置綁定) 格式的字典中提取詞條。當使用 wordforms 時可用這些詞條對索引進行定制.
indextool: 工具程式,用來轉儲關于索引的多項調試資訊。此工具是從版本Coreseek 3.1(Sphinx 0.9.9-rc2)開始加入的。
mmseg: 工具程式和庫,Coreseek用于提供中文分詞和詞典處理。
安裝前準備環境
yum install make gcc g++ gcc-c++ libtool make mysql-devel libxml2-devel expat-devel
官網參考位址:http://www.coreseek.cn/products/products-install/install_on_bsd_linux/RHEL5-5/
來到官網http://www.coreseek.com/下載下傳Coreseek 3.2.14穩定版,解壓進入目錄。
# tar xf coreseek-3.2.14.tar.gz
# cd coreseek-3.2.14
配置語言支援中文
# export LANG="zh_CN.UTF-8"
# export LC_ALL="zh_CN.UTF-8"
# cat testpack/var/test/test.xml
<a href="http://s3.51cto.com/wyfs02/M01/54/4C/wKiom1R-i4bgy4L2AAGxpagGNaw469.jpg" target="_blank"></a>
安裝coreseek開發的mmseg,為coreseek提供中文分詞功能
# cd mmseg-3.2.14/
# ./bootstrap
# ./configure --prefix=/usr/local/mmseg3
# make && make install
中文分詞測試
# /usr/local/mmseg3/bin/mmseg -d /usr/local/mmseg3/etc src/t1.txt
中文/x 分/x 詞/x 測試/x
中國人/x 上海市/x
Word Splite took: 0 ms.
安裝coreseek
# cd csft-3.2.14/
# sh buildconf.sh
1
<code>.</code><code>/configure</code> <code>--prefix=</code><code>/alidata/server/sphinx/coreseek</code> <code>--without-python --without-unixodbc --with-mmseg --with-mmseg-includes=</code><code>/alidata/server/sphinx/mmseg3/include/mmseg</code> <code>--with-mmseg-libs=</code><code>/alidata/server/sphinx/mmseg3/lib/</code> <code>--with-mysql=</code><code>/alidata/server/mysql</code> <code>--with-mysql-includes=</code><code>/alidata/server/mysql/include/</code>
測試是否可以正常運作
# /usr/local/coreseek/bin/indexer -c /usr/local/coreseek/etc/sphinx-min.conf.dist
<a href="http://s3.51cto.com/wyfs02/M02/54/4B/wKioL1R-jGuw-AWdAAFTJpw38mI702.jpg" target="_blank"></a>
csft-4.0版顯示:ERROR: nothing to do.
coreseek中文全文檢索測試
# cd testpack/
# /usr/local/coreseek/bin/indexer -c etc/csft.conf
<a href="http://s3.51cto.com/wyfs02/M02/54/4C/wKiom1R-jEfDtn-DAAEXq729j_8678.jpg" target="_blank"></a>
索引全部資料
# /usr/local/coreseek/bin/indexer -c etc/csft.conf -all
<a href="http://s3.51cto.com/wyfs02/M01/54/4B/wKioL1R-jcrxJ2dNAAG8p9tFa-I285.jpg" target="_blank"></a>
索引指定資料
# /usr/local/coreseek/bin/indexer -c etc/csft.conf xml
<a href="http://s3.51cto.com/wyfs02/M01/54/4D/wKiom1R-kE2BkFSPAAGH6upCW9M497.jpg" target="_blank"></a>
測試搜尋
# /usr/local/coreseek/bin/search -c etc/csft.conf
<a href="http://s3.51cto.com/wyfs02/M02/54/4D/wKiom1R-kM_gwWq9AAFuX0pLqho609.jpg" target="_blank"></a>
測試搜尋關鍵詞
# /usr/local/coreseek/bin/search -c etc/csft.conf -a hello歡迎來到北京清華大學
<a href="http://s3.51cto.com/wyfs02/M00/54/4D/wKiom1R-kQ_z2PkyAAFde5WUkvA847.jpg" target="_blank"></a>
開啟搜尋服務
# 如要已啟動服務,要更新索引,請使用 /usr/local/coreseek/bin/indexer-c etc/csft.conf --all --rotate
# 如要停止搜尋服務,請使用 /usr/local/coreseek/bin/searchd-c etc/csft.conf --stop
然後,請參考csft-3.2.14下api目錄中的相關檔案,使用PHP、Python、Ruby、Java來測試搜尋服務;也可以前往< ahref="/products-install/step_by_step/">搜尋服務建立三步曲,檢視第三步使用PHP測試。
通過以上步驟,coreseek已經安裝測試完成,可以提供正常的xml資料源索引以及提供對應的搜尋服務了,下一步工作,請檢視手冊,準備好mysql資料資訊,以及進行mysql資料源的測試,并在您的應用中調用搜尋服務;mysql資料源的配置可參考testpack/etc/csft_mysql.conf檔案
快速安裝位址:http://www.coreseek.cn/product_install/install_on_bsd_linux/#mysql
在實作以上功能之後,即可開始下面的實驗。
LAMP+Coreseek+sphinx建構中文檢索引擎
安裝好LAMP環境,并将它們啟動(略),在前面的文章中都有講到。
1、 先給資料庫插入一些資料,用于測試,在解壓coreseek源碼包後可以在/coreseek-4.1-beta/testpack/var/test/找到.sql的資料庫腳本檔案,導入資料庫即可。
2、 安裝PHP的sphinx擴充
可以在這裡(http://pecl.php.net/package/sphinx)找到sphinx的php擴充源碼,注意,使用phpize,configure的時候可能會要求要安裝libsphinxclient,它在coreseek-4.1-beta/csft-4.1/api/libsphinxclient/裡面能找到,編譯安裝它以後就可以configure,make,生成動态so檔案了。
3、 給服務提供配置檔案 (源碼目錄下有樣例: /coreseek-4.1-beta/testpack/etc/csft_mysql.conf)
#源定義
source study
{
type = mysql
sql_host = localhost
sql_user = root
sql_pass =
sql_db = test
sql_port = 3306
sql_query_pre = SET NAMES utf8
sql_query = select id,title,content,group_id from documents;
// 這裡使用select 将想要被用于檢索的索引字段查出來,緩存于Sphinx伺服器中,sql_query第一列id需為整數,title、content作為字元串/文本字段,被全文索引
sql_query_info = SELECT * FROM documents where id=$id
#僅被指令行搜尋所用,用來擷取和顯示文檔資訊,目前僅對MySQL有效,且僅用于調試目的。此查詢為每個文檔ID擷取CLI搜尋工具要顯示的文檔資訊。它需要包含<code>$id</code>宏,以此來對應到查詢的文檔的ID。
}
#index定義
index study
source = study #對應的source名稱
path = /usr/local/coreseek/var/data/study
docinfo = extern
mlock = 0
morphology = none //不使用任何詞形處理器
min_word_len = 1 //最小索引詞長度。可選選項,預設為1(索引任何詞)
html_strip = 0
charset_dictpath = /usr/local/mmseg3/etc/ //設定中文分詞詞典所在的目錄
#charset_dictpath = etc/
charset_type = zh_cn.utf-8
source mysql
sql_db = tuchao
sql_query = SELECT id, title, abstract FROM ic_video
sql_query_info = SELECT * FROM ic_video where id=$id
index mysql
source = mysql
path = /usr/local/coreseek/var/data/mysql
morphology = none
min_word_len = 1
charset_dictpath = /usr/local/mmseg3/etc/
#charset_dictpath = etc/
source qupeiyin
sql_db = tuchao2
sql_query = SELECT id, title, description FROM course
sql_query_info = SELECT * FROM course where id=$id
index qupeiyin
source = qupeiyin
path = /usr/local/coreseek/var/data/qupeiyin
#charset_dictpath = etc/
#全局index定義
indexer
mem_limit = 128M //索引過程記憶體限制,indexer不會超越的強制記憶體限制,設定太低會影響索引速度,一般為256M~1024M,最大限制是2048M.
#searchd服務定義
searchd
listen = 9312
read_timeout = 5 //網絡用戶端請求的讀逾時時間, <code>searchd</code> 強制關閉在此時間内未能成功發出查詢的用戶端連接配接。
max_children = 30 //子程序的最大數量,任何時候不可能有比此設定值更多的搜尋同時運作。當達到限制時,新的輸入用戶端會被用臨時失敗(SEARCH_RETRY)狀态碼駁回;
max_matches = 1000 //為每個索引所保持并傳回給用戶端的比對數目的最大值
seamless_rotate = 1 //啟用無縫輪換,資料輪換時不暫停搜尋服務。
preopen_indexes = 0
unlink_old = 1 //索引輪換成功之後,是否删除以.old為擴充名的索引拷貝。可選選項,預設為1(删除這些索引拷貝)。
pid_file = /usr/local/coreseek/var/log/searchd_mysql.pid
log = /usr/local/coreseek/var/log/searchd_mysql.log
query_log = /usr/local/coreseek/var/log/query_mysql.log
在寫配置檔案的時候,sourece名稱可以與index名稱不一樣,但是path後的名稱一定要和index定義的名稱一緻。
4、提供服務啟動腳本
#!/bin/bash
#
# searchd - this script start and stop the searchd daemon
#
# chkconfig - 85 20
# description:
# processname: searchd
# config: /usr/local/coreseek/etc/csft_mysql.conf
. /etc/rc.d/init.d/functions
searchd="/usr/local/coreseek/bin/searchd"
prog=$(basename $searchd)
conf_file="/usr/local/coreseek/etc/csft_mysql.conf"
lockfile="/var/lock/subsys/searchd"
start() {
[ -e $lockfile ] && echo "searchd is already start" && exit 0
[ -x $searchd ] || exit 1
[ -f $conf_file ] || exit 2
echo -n "Starting $prog:"
daemon $searchd -c $conf_file
retval=$?
echo
if [ $retval -eq 0 ]; then
touch $lockfile
else
echo "$prog is starting failed"
fi
return $retval
stop() {
echo -n $"Stopping $prog:"
killproc $prog -QUIT
rm -rf $lockfile
restart() {
stop
sleep 1
start
indexer() {
/usr/local/coreseek/bin/indexer -c $conf_file --all
case "$1" in
start)
start
;;
stop)
stop
;;
restart)
restart
indexer)
indexer
*)
echo "Usage:$0 {start|stop|restart|indexer}"
exit 2
esac
5、 重建全部索引
# /etc/init.d/searchd indexer
<a href="http://s3.51cto.com/wyfs02/M00/57/36/wKioL1SVGm_C--PGAAGBaCYcCW8559.jpg" target="_blank"></a>
6、 啟動searchd服務
# service searchd start
<a href="http://s3.51cto.com/wyfs02/M01/57/38/wKiom1SVGfCCWZAkAAG2-9Ntc5o667.jpg" target="_blank"></a>
7、 提供PHP測試程式
<?php
$s = new SphinxClient;
$s->setServer("localhost", 9312);
$s->setArrayResult(true);
$s->setSelect();
$s->setMatchMode(SPH_MATCH_ALL);
//SPH_MATCH_ALL這個檢索方法表示隻顯示比對到的資料ID,并進行分詞。SPH_MATCH_ANY表示先将搜尋的内容進行分詞,輸出每個分詞比對到的資料ID。
$result1 = $s->query('喬布斯','mysql');
$result2 = $s->query('搞笑','qupeiyin');
$result3 = $s->query('Google','study');
print_r($result1);
print_r($result2);
print_r($result3);
?>
8、測試服務
我可以在httpd伺服器指定的目錄下建立一個test.php拷貝以上代碼,根據自己的資料庫資料做更改後儲存。
這一句我要講下: $result1 = $s->query('喬布斯','mysql'); “喬布斯“是搜尋的關鍵詞,後面的’mysql ’對應的是定義在csft_mysql.conf中的索引名稱。表示從哪個索引中找
以下是用浏覽器通路test.php傳回的結果:
<a href="http://s3.51cto.com/wyfs02/M00/57/36/wKioL1SVHA3zks_OAALbYkfToLo666.jpg" target="_blank"></a>
首先傳回結果是在mysql索引中搜尋關鍵詞‘喬布斯’ 的,可以看到在id=>38 、id=>39 有比對到,而且對搜集内容進行了分詞。
[matches] => Array ( [0] => Array ([id] => 38 [weight] => 6 [attrs] => Array ( ) ) [1] => Array ( [id]=> 39 [weight] => 3 [attrs] => Array ( ) ) ) [total] => 2 [total_found]=> 2 [time] => 0.002 [words] => Array ( [喬] =>Array ( [docs] => 2 [hits] => 3 ) [布] => Array ([docs] => 2 [hits] => 3 ) [斯] => Array ( [docs] => 2 [hits] => 3 ) ) )
我們上MySQL伺服器查找對應ID來驗證:
<a href="http://s3.51cto.com/wyfs02/M00/57/39/wKiom1SVG6yCXgugAAQlK5NWBiE542.jpg" target="_blank"></a>
我們再分析後續的輸出結果,在qupeiyin索引中搜尋‘ 搞笑’ 關鍵詞,這裡可以看到在id=>29 、 id=>518 有比對到.
Array ( [error] => [warning] =>[status] => 0 [fields] => Array ( [0] => title [1] => description )[attrs] => Array ( ) [matches] => Array ( [0] => Array ( [id] => 29 [weight] => 1 [attrs] => Array () ) [1] => Array ( [id] => 518 [weight]=> 1 [attrs] => Array ( ) ) ) [total] => 2 [total_found] => 2[time] => 0.002 [words] => Array ( [搞笑] => Array ([docs] => 2 [hits] => 2 ) ) )
我們再來到資料庫驗證:
<a href="http://s3.51cto.com/wyfs02/M01/57/39/wKiom1SVHAni20lhAAI7IldQj_M848.jpg" target="_blank"></a>
<a href="http://s3.51cto.com/wyfs02/M02/57/36/wKioL1SVHLyAsyxwAAKuxXjR0SA840.jpg" target="_blank"></a>
第三個輸出也是可以找到對應的資料的,筆者就不上圖了,由此可以看出,在對應的ID号确實能找到比對的資料。
本文轉自qw87112 51CTO部落格,原文連結:http://blog.51cto.com/tchuairen/1585871