一 sphinx 簡介
在 使用mysql資料庫過程中,如果想實現全文檢索的優化,可以使用mysql自帶全文索引,但是不支援中文。。關於sphinx的安裝網上很多教程寫的都 不錯比如:http://www.coreseek.cn/products-install/。這裡就不再說明安裝方法了。有興趣的可以自己參考。
MySQL在高併發連線、資料庫記錄數較多的情況下,SELECT ... WHERE ... LIKE '%...%'的
全文搜尋方式不僅效率差,而且以萬用字元%和_開頭作查詢時,使用不到索引,需要全表掃描,對數
據庫的壓力也很大。MySQL針對這一問題提供了一種全文索引解決方案,這不僅僅提高了效能和效
率(因為MySQL對這些欄位做了索引來優化搜尋),而且實現了更高質量的搜尋。但是,至今為
止,MySQL對中文全文索引無法正確支援。
可 以使用Sphinx(一種全文檢索引擎)技術,Sphinx預設不支援中文索引及檢索。以前用Coreseek的補丁來解決,目前Coreseek 不單獨提供補丁檔案,而基於sphinx開發了Coreseek 全文檢索伺服器,Coreseek應該是現在用的最多的sphinx中文全文檢索,它提供了為Sphinx設計的中文分詞包LibMMSeg包含 mmseg中文分詞。
Sphinx的基本原理與檢索流程
這種檢索流程使用sphinx官方為我們提供的API檔案(php使用sphinxapi.php),首先php通過這個api連線sphinx伺服器,獲取查詢結果的id資訊,然後再通過這些id從mysql資料庫中 取得相關的資料。
SphinxSE -- 基於Sphinx儲存引擎檢索(以後再詳細介紹)
二、 Sphinx安裝
Sphinx在mysql上的應用有兩種方式:
- 採用API呼叫,如使用PHP、java等的API函式或方法查詢。優點是可不必對mysql重新編譯,服務端程式“低耦合”,且程式可靈活、方便的呼叫;缺點是如已有搜尋程式的條件下,需修改部分程式。推薦程式設計師使用。
- 使用外掛方式(sphinxSE)把sphinx編譯成一個mysql外掛並使用特定的sql語句進行檢索。其特點是,在sql端方便組合,且能直接返回資料給客戶端。不必二次查詢,在程式上僅需要修改對應的sql,但這對使用框架開發的程式很不方便,比如使用了ORM。另外還需要對mysql進行重新編譯,且需要mysql-5.1以上版本支援外掛儲存。
這裡的安裝主要介紹的是第一種通過api呼叫的方式。Sphinx的安裝如下:
#下載最新穩定版 該方式不支援中文分詞 wget http://www.sphinxsearch.com/downloads/sphinx-0.9.9.tar.gz tar xzvf sphinx-0.9.9.tar.gz cd sphinx-0.9.9 ./configure --prefix=/usr/local/sphinx/ --with-mysql --enable-id64 make make install
三、 Sphinx中文分詞
中文的全文檢索和英文等latin系列不一樣,後者是根據空格等特殊字元來斷詞,而中文是根據語義來分詞。中文分詞主要有2個外掛
- Coreseek
Coreseek是現在用的最多的sphinx中文全文檢索,它提供了為Sphinx設計的中文分詞包LibMMSeg ,是基於sphinx的基礎上開發的
2.sfc(Sphinx-for-chinese)
sfc(sphinx-for-chinese)是由網友happy兄提供的另外一箇中文分詞外掛。其中文詞典採用的是xdict。
四 、安裝sphinx 中文分詞
- 安裝升級autoconf
因為coreseek需要autoconf 2.64以上版本,因此需要升級autoconf,不然會報錯,安裝方法如下:
tar -jxvf autoconf-2.64.tar.bz2 cd autoconf-2.64 ./configure make make install
- 下載coreseek
新版本的coreseek將詞典和sphinx源程式放在了一個包中,因此只需要下載coreseek包就可以了。下載連結 http://www.coreseek.cn/
- 安裝mmseg(coreseek所使用的詞典)
tar zxvf coreseek-4.1-beta.tar.gz cd coreseek-4.1-beta/ cd mmseg-3.2.14/ ./bootstrap #注意一點要執行該操作 不然編譯csft會報錯 ./configure --prefix=/usr/local/mmseg
make&&make install
- 安裝coreseek(sphinx)
cd csft-3.2.14
cd csft-4.1/ sudo ./buildconf.sh #執行該項shell 指令碼 生成 配置檔案 sudo ./configure --prefix=/usr/local/coreseek --without-unixodbc --with-mmseg --with-mmseg-includes=/usr/local/mmseg/include/mmseg/ --with-mmseg-libs=/usr/local/mmseg/lib/ --with-mysql make &&make install
##編譯該檔案比較浪費時間
make[2]:正在離開目錄 `/usr/local/src/coreseek-4.1-beta/csft-4.1/doc'
make[1]:正在離開目錄 `/usr/local/src/coreseek-4.1-beta/csft-4.1/doc'
make[1]: 正在進入目錄 `/usr/local/src/coreseek-4.1-beta/csft-4.1'
make[2]: 正在進入目錄 `/usr/local/src/coreseek-4.1-beta/csft-4.1'
test -z "/usr/local/coreseek/etc" || mkdir -p -- "/usr/local/coreseek/etc"
/usr/bin/install -c -m 644 'sphinx.conf.dist' '/usr/local/coreseek/etc/sphinx.conf.dist'
/usr/bin/install -c -m 644 'sphinx-min.conf.dist' '/usr/local/coreseek/etc/sphinx-min.conf.dist'
/usr/bin/install -c -m 644 'example.sql' '/usr/local/coreseek/etc/example.sql'
make install-data-hook
make[3]: 正在進入目錄 `/usr/local/src/coreseek-4.1-beta/csft-4.1'
mkdir -p /usr/local/coreseek/var/data && mkdir -p /usr/local/coreseek/var/log
make[3]:正在離開目錄 `/usr/local/src/coreseek-4.1-beta/csft-4.1'
make[2]:正在離開目錄 `/usr/local/src/coreseek-4.1-beta/csft-4.1'
make[1]:正在離開目錄 `/usr/local/src/coreseek-4.1-beta/csft-4.1
常遇到的問題 比如 擷取自其他人的網站:
1 如果你的gcc>=4.7安裝的過程中:會make編譯不通過,提示: error: ‘ExprEval’ was not declared in this scope 這個是從別人的網站上邊扒下來的: 具體還不知道什麼意思
是關於coreseek上游的sphinx的同樣問題的,看了一下了解似乎是gcc 4.7、gcc 4.8的C++作用域的問題(?),上面的debian bugs裡面提供了一個patch,看了下patch的內容,也對自己本地的coreseek的製作了同樣的補丁,壓縮包釋出如下,使用時注意版本:
解壓後,用sphinxexpr.cpp覆蓋coreseek-4.1-beta/csft-4.1/src下的同名檔案重新編譯即可
2 編譯時提示:tokenizer_zhcn.h:26:30: error: SegmenterManager.h:
該問題說明編譯mmseg的時候,沒有執行:$ ./bootstrap 檢視詳細的編譯 步驟
五、測試coreseek 中文
六、開啟sphinx php 擴充
1、首先下載擴充模組 :http://pecl.php.net/package/sphinx
tar zxvf sphinx-1.3.3.tgz cd sphinx-1.3.3 locate phpize /usr/local/php/bin/phpize locate php-config ./configure --with-php-config=/usr/local/php/bin/php-config --with-sphinx
執行./configure 提示錯誤 configure: error: Cannot find libsphinxclient headers
#解決方法: cd coreseek-4.1/csft-4.1/api/libsphinxclient/ ./configure --prefix=/usr/local/libsphinxclient sudo make && make install
還有可能會出現問題 config.status: error: cannot find input file: Makefile.in
#config.status: error: cannot find input file: src/Makefile.in #網上找到的解決辦法 aclocal libtoolize --force automake --add-missing autoconf autoheader make clean
解決完成以上問題之後執行
./configure --with-php-config=/usr/local/php/bin/php-config --with-sphinx=/usr/local/libsphinxclient
make&&make install
vi /etc/php5/cli/php.ini
#新增資訊
extension_dir = "/usr/local/php/lib/php/extensions/no-debug-zts-20131226/"
extension=memcache.so
extension=redis.so
;extension=opcache.so
extension=mongo.so
extension=sphinx.so #新增該選項
重啟 apache 或者nginx 檢視 phpinfo 是不是含有該項擴充。
。