mysql coreseek_关于mysql中文全文检索Sphinx之coreseek
在使用mysql數(shù)據(jù)庫過程中,如果想實(shí)現(xiàn)全文檢索的優(yōu)化,可以使用mysql自帶全文索引,但是不支持中文。。關(guān)于sphinx的安裝網(wǎng)上很多教程寫的都不錯(cuò)比如:http://www.coreseek.cn/products-install/。這里就不再說明安裝方法了。有興趣的可以自己參考。
MySQL在高并發(fā)連接、數(shù)據(jù)庫記錄數(shù)較多的情況下,SELECT ... WHERE ... LIKE '%...%'的全文搜索方式不僅效率差,而且以通配符%和_開頭作查詢時(shí),使用不到索引,需要全表掃描,對數(shù)據(jù)庫的壓力也很大。MySQL針對這一問題提供了一種全文索引解決方案,這不僅僅提高了性能和效率(因?yàn)镸ySQL對這些字段做了索引來優(yōu)化搜索),而且實(shí)現(xiàn)了更高質(zhì)量的搜索。但是,至今為止,MySQL對中文全文索引無法正確支持。
可以使用Sphinx(一種全文檢索引擎)技術(shù),Sphinx默認(rèn)不支持中文索引及檢索。以前用Coreseek的補(bǔ)丁來解決,目前Coreseek 不單獨(dú)提供補(bǔ)丁文件,而基于sphinx開發(fā)了Coreseek 全文檢索服務(wù)器,Coreseek應(yīng)該是現(xiàn)在用的最多的sphinx中文全文檢索,它提供了為Sphinx設(shè)計(jì)的中文分詞包LibMMSeg包含mmseg中文分詞。
Sphinx的基本原理與檢索流程
這種檢索流程使用sphinx官方為我們提供的API文件(php使用sphinxapi.php),首先php通過這個(gè)api連接sphinx服務(wù)器,獲取查詢結(jié)果的id信息,然后再通過這些id從mysql數(shù)據(jù)庫中 取得相關(guān)的數(shù)據(jù)。
SphinxSE — 基于Sphinx存儲(chǔ)引擎檢索
這種檢索流程,把sphinx編譯成mysql的存儲(chǔ)引擎,SphinxSE是一個(gè)可以編譯進(jìn)MySQL 5.x版本的MySQL存儲(chǔ)引擎,它利用了該版本MySQL的插件式體系結(jié)構(gòu)。盡管被稱作“存儲(chǔ)引擎”,SphinxSE自身其實(shí)并不存儲(chǔ)任何數(shù)據(jù)。它其實(shí)是一個(gè)允許MySQL服務(wù)器與searchd交互并獲取搜索結(jié)果的嵌入式客戶端。所有的索引和搜索都發(fā)生在MySQL之外。
SphinxSE的使用:
當(dāng)需要在MySQL端對Sphinx結(jié)果集做額外處理(例如對原始文檔表做JOIN,MySQL端的額外過濾等等)時(shí)提供優(yōu)化。
要通過SphinxSE搜索,需要建立特殊的ENGINE=SPHINX的“搜索表”,然后使用SELECT語句從中檢索,把全文查詢放在WHERE子句中。
創(chuàng)建一張表t1
CREATE TABLE t1
(
id INTEGER UNSIGNED NOT NULL,
weight INTEGER NOT NULL,
query VARCHAR(3072) NOT NULL,
group_id INTEGER,
INDEX(query)
) ENGINE=SPHINX CONNECTION=”sphinx://localhost:9312/test1″;
搜索表前三列的類型必須是INTEGER,INTEGER和VARCHAR,這三列分別對應(yīng)文檔ID,匹配權(quán)值和搜索查詢。查詢列必須被索引,其他列必須無索引。列的名字會(huì)被忽略,所以可以任意命名,參數(shù)CONNECTION來指定用這個(gè)表搜索時(shí)的默認(rèn)搜索主機(jī)、端口號和索引,語法格式:CONNECTION=”sphinx://HOST:PORT/INDEXNAME”。
執(zhí)行SQL語句 select d.id,d.title,d.content from t1 join documents as d on t1.id = d.id and t1.query = ‘研究生創(chuàng)業(yè)’;
+—-+——————–+———————–+
| id | title | content |
+—-+——————–+———————–+
| 5 | 研究生的故事 | 研究生自主創(chuàng)業(yè) |
+—-+——————–+———————–+
1 row in set (0.04 sec)
結(jié)果返回了我們想要的數(shù)據(jù),可見利用SphinxSE可以僅僅在SQL語句上做很小的改動(dòng)即可很方便的實(shí)現(xiàn)全文檢索!
主索引 + 增量索引
前提:數(shù)據(jù)不會(huì)被改變
第一步:建表: (用來存索引過的最大的記錄 id)
Create table a(
Id int unsigned not null primary key,
Max_id int unsigned,
);
第二步:修改配置文件為:見 sphinx配置文件
第三步:先執(zhí)行 ./bin/indexer –c ./etc/sphinx.conf –test1
生成所有的索引-〉一個(gè)數(shù)據(jù)源的主查詢,只有第一次執(zhí)行
第四步:定期執(zhí)行:
./bin/indexer –c ./etc/sphinx.conf delta –rotate
生成增量的索引文件
第五步:合并到主索引中
./bin/indexer –merge test1 delta –c ./etc/sphinx.conf –rotate
總結(jié)
以上是生活随笔為你收集整理的mysql coreseek_关于mysql中文全文检索Sphinx之coreseek的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Mybatis 算术逻辑运算
- 下一篇: Mysql数据库正则表达式