全文搜尋Lucene 之倒排演算法

2021-09-02 09:03:34 字數 1424 閱讀 2854

[size=large]背景[/size]

關聯式資料庫不適合做全文搜尋

[list]

[*]like '%***%'效率很慢,建的索引將無效,查詢的時候會像翻書一樣一頁一頁的翻

[*]當搜尋live的時候,也想把lives/living搜出來,但是資料庫很難做到[/list]

[size=large]倒排演算法[/size]

lucene在國外知名度很高,現在已經是apache的頂級專案,國內也有很多應用,它使用的就是倒排檔案索引結構,演算法結構如下:

(0)設有兩篇文章1和2

[list]

[*]a.我們現在有的是文章內容,即乙個字串,我們先要找出字串中的所有單詞,即分詞。英文單詞由於用空格分隔,比較好處理。中文單詞間是連在一起的需要特殊的分詞處理。

[*]b.文章中的」in」, 「once」 「too」等詞沒有什麼實際意義,中文中的「的」「是」等字通常也無具體含義,這些不代表概念的詞可以過濾掉

[*]c.使用者通常希望查「he」時能把含「he」,「he」的文章也找出來,所以所有單詞需要統一大小寫。

[*]d.使用者通常希望查「live」時能把含「lives」,「lived」的文章也找出來,所以需要把「lives」,「lived」還原成「live」

[*]e.文章中的標點符號通常不表示某種概念,也可以過濾掉

[/list]

經過上面處理後

[table]

|  guangzhou |1 |

|  he | 2 |

|  i |1 |

|  live |1,2 |

|  shanghai |2 |

|  tom |1 |

[/table]

加上「出現頻率」和「出現位置」資訊後,我們的索引結構變為:

[table]

| guangzhou| 1| [2]| 3,6|

| he| 2| [1] | 1|

| i | 1| [1]| 4|

| live | 1| [2]| 2,5|

| | 2| [1]| 2|

| shanghai| 2| [1] | 3|

| tom | 1| [1]| 1|

[/table]

(4) 以live 這行為例我們說明一下該結構:live在文章1中出現了2次,文章2中出現了一次,它的出現位置為「2,5,2」這表示什麼呢?我們需要結合文章號和出現頻率來分析,文章1中出現了2次,那麼「2,5」就表示live在文章1中出現的兩個位置,文章2中出現了一次,剩下的「2」就表示live是文章2中第 2個關鍵字。

[size=large]結語[/size]

參考:參考的這篇文章裡講得更詳細,網上也有很多介紹倒排演算法的文章。既然已經有了,為什麼我還要寫這篇文章呢?我的考慮是倒排演算法是搜尋引擎的核心,理解了它能更好的理解搜尋引擎的其他東西,也作為後續關於搜尋引擎文章的完整性。

全文搜尋與倒排索引

全文搜尋是指計算機搜尋程式通過掃瞄文章中的每乙個詞,對每乙個詞建立乙個索引,指明該詞在文中出現的次數和位置,當使用者查詢時,搜尋程式就根據事先建立的索引進行查詢,並將查詢的結果反饋給使用者。這個過程類似於通過字典中的搜尋字表查字的過程,lucene是目前全球使用最廣的全文搜尋引擎開源庫。倒排索引源於...

Lucene全文搜尋工具分析

專案中都會有搜尋的功能,有些搜尋非常簡單,就是按照姓名查詢或者按著性別查詢。這樣的查詢我們會用到模糊查詢,也就是like。如果是兩個也就是用like 和or關鍵字。like關鍵字是非常影響效率的,這點我們可以從乙個生活中的例子來看就能夠知道。我們使用like關鍵字就好像是我們在查一本沒有目錄的字典,...

Lucene全文搜尋學習筆記(二)

luceneutil的編寫,主要是對document2bean以及bean2document操作的封裝。寫的不完善,先學完lucene再說。public class luceneutil catch exception e param obj 傳入的物件,用到反射將field存入索引庫 return...