倒排索引原理_搜索引擎都在用的倒排索引——原理与实现
什么是倒排索引
倒排索引(Inverted index),個人理解倒排的意思是說,普通的搜索算法,是從文檔里搜索一個關鍵詞(文檔→關鍵詞),而倒排索引是首先知道了每個關鍵詞都出現在了哪些文檔里,從關鍵詞搜文檔(關鍵詞→文檔),正好目的反過來,和“顛倒搜索”沒什么關系。
倒排索引的好處
想象一個場景,你要對一個很大的文件搜索其中是否有一個關鍵詞,常規的做法是遍歷整個文檔,那么如果關鍵詞在文檔最后,就會非常慢
倒排索引先記錄了每個關鍵詞出現在了哪些文檔里,需要哪個關鍵詞,把含有的文檔直接拎出來就可以,這樣就快多了
主流的搜索工具,ElasticSearch都是基于倒排索引的方式
如何建立一個倒排索引
舉個栗子,假設我們有如下0-4五個文檔
分詞后可以得到這16個關鍵詞,倒排列表中記錄的是那些文檔包含這個關鍵詞
實際使用的一些問題
自己實現一個倒排,個人感覺需要注意一下模糊搜索的問題和匹配算法的設計,在使用ES時,雖然這些已經做好了,但是感覺有時效果不佳,具體實現機制還需要再研究。
模糊匹配
我們應該希望系統具有這樣的能力
- 匹配縮寫:搜索 UK ,會返回包含 United Kindom 的文檔
- 匹配詞根:搜索 jump ,會匹配 jumped , jumps
- 匹配同義詞:搜索 johnny walker 會匹配 Johnnie Walker , 搜索 people ,會返回包含 person 的文檔
- 理解語境:搜索fox news hunting 應該返回福克斯新聞( Foxs News )中關于狩獵的故事,而搜素so fox hunting news 應該返回關于獵狐的故事
要使得系統能夠坐到這一點,就需要在分詞階段,對詞條進行規范,真實場景下,很多時候并不能實現兩個token之間的完美匹配,這時基于token的匹配就失去的作用
自己在使用ES的過程中,普通的匹配無法做到對單復數這種簡單情況的處理,或許在建立索引是有一些操作,還需要繼續研究
匹配算法設計
如何設計一個合理的匹配算法也是值得研究的問題,如何給搜索結果打分。
例如一個文檔,我們用大寫字母表示詞條,大寫字母組成的字符串表示一個文檔,對于一個關鍵詞CDEF,匹配算法應該能夠對于這幾種情況給出不同的分數
比如有的匹配到CDF三個,有的只匹配到CD兩個,通常是匹配更多數量的分數應該更高
比如都是匹配到三個詞條,一個是CDE,一個是DEF,如果C是一個類似頻繁項的詞條,F是一個對文檔比較重要的詞條,那么后者的的風應該更高
匹配到相同的詞條列表的得分應該是不一樣的
比如都是匹配到CDE三個詞條,有的是連續出現的(ABCDEFG),有的是分開出現(ABCGDFE)或者順序不同(ABCEDFG),他們的得分應該是不同的。
另外從搜索的意圖上看
一些專有名詞本質上就是不可分割的(New York不能看成New和York)
一些專有名詞去掉其中一些token或改變順序也并不影響詞義(University of Pittsburgh和Pittsburgh university)。
2. 如果搜索僅僅是幾個關鍵詞的組合,比如平時使用搜索引擎的場景,那么每個token都是獨立的可以以任意順序在文檔中出現。
參考資料
總結
以上是生活随笔為你收集整理的倒排索引原理_搜索引擎都在用的倒排索引——原理与实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JavaScript的回调函数是什么
- 下一篇: ueditor 添加按钮不显示_不可思议