請大神推薦符合描述的中文全文檢索引擎有哪些?
時間:2023-04-02 06:20:01 | 來源:電子商務(wù)
時間:2023-04-02 06:20:01 來源:電子商務(wù)
一直有人私信咨詢mysql全文索引問題,我單獨寫了一篇實現(xiàn)方法:
以下是我5年前的原回答:
========================
關(guān)于中文全文索引引擎,我用過MYSQL、迅搜、sphinx、coreseek、SFC、solr。每一樣都從頭摸到尾,我來說說你的問題。
1、先來說coreseek
coreseek是老版本的sphinx的中文版本。因為sphinx不支持中文字符,不支持的原因是:gbk 2字節(jié),utf8 3字節(jié),sphinx是俄羅斯基佬寫的,不是很了解中文的情況(韓文日文使用也存在一樣的問題)
coreseek 版本5一直難產(chǎn),做了2-3年了一直沒有發(fā)布。這恐怕是越來越多人放棄的原因吧。
和coreseek一樣,還有一個sphinx中文改進版叫做:SFC:sphinx for chinese。在這里:sphinx-for-chinese sphinx-search.com
不管是SFC還是CORESEEK,大致原理都是做一份字典,在簡歷索引的時候根據(jù)這份字典來。
舉個例子:
“中文全文檢索引擎”,在做索引的時候是這樣的:中文/全文檢索/引擎
“/”隔開的每個詞是一個主題,搜“全文檢索”的時候可以匹配到,搜“全文”的時候匹配不到。
為了改變這個問題,只能制作更低粒度的字典,比如在字典里面加入:“全文”和“檢索” 2個詞
可能存在的bug是這樣的:
“杭州市長春藥店”,在做索引的時候如果這樣的:杭州/市長/春藥店
這樣分割的話,搜:“長春”就搜不出來了。
這恐怕是大部分采用字典做全文索引的工具的通病,解決辦法就是不斷的修改和訓(xùn)練字典。
2、sphinx使用中文的辦法
sphinx也并非無法支持中文,只要你告訴sphinx,哪些3字節(jié)的utf8中文是不可分割的,sphinx就可以切割的很好。
sphinx支持中文的一個犧牲是:只能做一元索引(針對單字做索引),索引速度慢,查詢的時候耗費資源。
當(dāng)然也帶來一個好處是:100%的召回率。還是上面的例子,不管你是搜:“市長”還是“長春”,都有辦法查到。
sphinx如果支持中文一元索引,請看這里:Coreseek開源中文檢索引擎-Sphinx中文版
3、關(guān)于你說的過濾邏輯太簡單
我不知道具體是怎么回事,根據(jù)我使用的情況,想要的任何查詢方式,sphinx或者coreseek都支持。
我估計下面這些知識你可能不了解:
a.匹配模式
SPH_MATCH_ALL,匹配所有查詢詞(缺省模式)
SPH_MATCH_ANY,匹配任意查詢詞
SPH_MATCH_PHRASE,短語匹配
SPH_MATCH_BOOLEAN,布爾表達式匹配
SPH_MATCH_EXTENDED,查詢匹配一個Sphinx內(nèi)部查詢語言表達式
b.布爾查詢允許使用下面特殊操作符:
AND:hello & world
OR:hello | world
NOT:hello -world或hello !world
Grouping:(hello world)
c.擴展查詢允許合我下面特殊操作符:
操作符OR:hello | world
操作符NOT:hello -world或hello !world
字段搜索操作符:@title hello @body world
短語(phrase)搜索符:”hello world”
臨近(proximity)搜索符:”hello world”~10
d.除此之外還支持:權(quán)重(匹配度,Weight),mysql擴展,分布式等等。
列出這么多,希望你可以去查一查資料
4、關(guān)于性能
我的機器可能比較好一些,我負責(zé)跑sphinx的那個機器配置是 24核心CPU,8G內(nèi)存,SSD硬盤
建立索引方面,我采用分布式:每4000萬短語(注意是短語)索引速度大約是6分鐘
載入速度方面是索引的速度的1/4
查詢速度實際和你的數(shù)據(jù)多少無關(guān),你可以在查詢語句里面用max_match控制返回最大數(shù)量。及時我把這個數(shù)量調(diào)大到1000萬的時候,返回30萬結(jié)果一次2分鐘(機械硬盤目測6-8分鐘,我的機器比較好)。如果返回記錄少,速度更快,基本上1萬結(jié)果5秒返回。返回不是輸出的意思,因為數(shù)據(jù)多的時候,CPU要合并數(shù)據(jù)并且從寄出去放到內(nèi)存里面。
5、我不知道你的一億數(shù)據(jù)是什么,如果是關(guān)鍵詞那跟我情況差不多。
6、上面說到很多sphinx,你可以把它等同于coreseek
最后,我覺得你對這個東西了解還太少,給你的建議是,
1.先把Coreseek開源中文檢索引擎-Sphinx中文版上全部文檔讀一遍,理解透徹。
2.針對文檔中的每個主題,上網(wǎng)查找相關(guān)技術(shù)文檔,都啃一遍
3.把coreseek論壇上回復(fù)數(shù)量多的帖子都讀一遍
4.英文可以的話,把這個也嘗試閱讀一下:Documentation
最后,不管你用什么引擎,你都得摸索,有的路人多好走,有的路走的人少,看起來幾乎走不通。荊棘之路,你要自己開拓,才能看到風(fēng)景。我已經(jīng)在路這頭看風(fēng)景,這邊人不多(據(jù)我所知騰訊大量使用sphinx),希望看到你的身影。