這幾天在看mysql全文索引相關的資料,摸到了sphinx這個全文索引的開源引擎上,在實驗環境中測試了下,過程如下。
sphinx是一個開源的全文索引引擎,對於web應用來講,可以對mysql、xml等來源的數據構造索引,然後通過php的接口進行輸出,在構架中有點類似于memcache的一種位置,位於數據和應用之間。當然前提是它的全文索引效率很高。
由於mysql自身的全文索引目前只能在myisam上實現,所以對於innodb表就只能通過sphinx這樣的外掛方式來解決了。不過,對於其他的應用也可以利用sphinx的索引效率來實現了,對於window上的mysql來講,sphinx也是一種有趣的補充。
安裝
wget http://www.sphinxsearch.com/downloads/sphinx-0.9.9.tar.gz
tar zxvf sphinx-0.9.9.tar.gz
cd sphinx-0.9.9
./configure –prefix=/usr/local/sphinx –with-mysql=/app/mysql –with-mysql-includes=/app/mysql/include/mysql –with-mysql-libs=/app/mysql/lib/mysql
make
make install
cd ../mysql-5.1.37
./configure –prefix=/app/mysql –with-charset=utf8 –with-extra-charsets=all –enable-thread-safe-client –enable-assembler –with-readline –with-big-tables –with-plugins=sphinx
mysql> show plugins;
mysql> show engines;
可以看到Sphinx的插件就基本沒啥問題了。
在sphinx.conf配置文件中,配置一個數據庫源,然後配置一個索引和源形成對應關係,通過對源的數據進行索引后來提供用戶查詢,基本的流程是這樣。在sphinx.conf有針對mysql源的實例配置。
然後在mysql中建立一個sphinx表:
CREATE TABLE `sphinx` (
`id` int(11) NOT NULL,
`weight` int(11) NOT NULL,
`query` varchar(255) NOT NULL,
`CATALOGID` INT NOT NULL,
`EDITUSERID` INT NOT NULL,
`HITS` INT NULL,
`ADDTIME` INT NOT NULL, KEY
`Query` (`Query`)
) ENGINE=SPHINX DEFAULT CHARSET=utf8 CONNECTION=’sphinx://localhost:3312/test1′
這個表和sphinx服務器及其索引名稱對應。
通過sphinx表來實現sql的全文檢索
SELECT doc.* FROM documents doc JOIN sphinx ON ( doc.id = sphinx.id ) WHERE query =’中国;mode=all’;
在sphinx的安裝目錄中可以看到一些常用命令:
indexer 操作索引的命令,包括建立、更新索引等;
search 手工搜索索引;
searchd 建立索引服務器,相應客戶端的索引請求。
sphinx默認可以實現中文的單字檢索,需要在sphinx.conf中修改幾個選項:
charset_type = utf-8
ngram_len = 1
ngram_chars = U+3000..U+2FA1F
如果要實現分詞的檢索需要其他的分詞插件的支持了,參考coreseek