倒排索引由兩個部分組成:單詞詞典和倒排檔案。
所有單詞的倒排列表順序的儲存在磁碟的某個檔案裡,這個檔案即被稱為倒排檔案,倒排檔案是儲存倒排索引的物理檔案。
單詞詞典是由文件集合中出現過的所有單詞構成的字串集合,單詞詞典內每條索引項記載單詞本身的一些資訊以及指向「倒排列表」的指標。
單詞詞典是倒排索引中非常重要的組成部分,它是用來維護文件集合中所有單詞的相關資訊,同時用來記載某個單詞對應的倒排列表在倒排檔案中的位置資訊。在支援搜尋時,根據使用者的查詢詞,去單詞詞典裡查詢,就能夠獲得相應的倒排列表。
對於乙個規模很大的文件集合來說,可能包含了幾十萬甚至上百萬的不同單詞,
快速定位某個單詞直接決定搜尋的響應速度,所以我們需要很高效的資料結構對單詞詞典進行構建和查詢。
常用的資料結構包含雜湊加鍊表和樹形詞典結構。
lucerne使用的是倒排檔案索引結構。該結構及相應的生成演算法如下:
a.我們現在有的是文章內容,即乙個字串,我們先要找出字串中的所有單詞,即分詞。英文單詞由於用空格分隔,比較好處理。中文單詞間是連在一起的需要特殊的分詞處理。
b.文章中的」in」, 「once」 「too」等詞沒有什麼實際意義,中文中的「的」「是」等字通常也無具體含義,這些不代表概念的詞可以過濾掉
c.使用者通常希望查「he」時能把含「he」,「he」的文章也找出來,所以所有單詞需要統一大小寫。
d.使用者通常希望查「live」時能把含「lives」,「lived」的文章也找出來,所以需要把「lives」,「lived」還原成「live」
e.文章中的標點符號通常不表示某種概念,也可以過濾掉
在lucene中以上措施由analyzer類完成。 經過上面處理後,
<2>建立倒排索引
文章1,2經過倒排後變成
guangzhou 1
he 2
i 1
live 1,2
shanghai 2
tom 1
加上「出現頻率」和「出現位置」資訊後,我們的索引結構變為:
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
以live 這行為例我們說明一下該結構:live在文章1中出現了2次,文章2中出現了一次,它的出現位置為「2,5,2」這表示什麼呢?我們需要結合文章號和出現頻率來分析,文章1中出現了2次,那麼「2,5」就表示live在文章1中出現的兩個位置,文章2中出現了一次,剩下的「2」就表示live是文章2中第 2個關鍵字。
<3>實現
<4>壓縮演算法
為了減小索引檔案的大小,lucene對索引還使用了壓縮技術。
其次大量用到的是對數字的壓縮,數字只儲存與上乙個值的差值(這樣可以減小數字的長度,進而減少儲存該數字需要的位元組數)。例如當前文章號是16389(不壓縮要用3個位元組儲存),上一文章號是16382,壓縮後儲存7(只用乙個位元組)。
<5>應用原因
下面我們可以通過對該索引的查詢來解釋一下為什麼要建立索引。
假設要查詢單詞 「live」,lucene先對詞典二元查詢、找到該詞,通過指向頻率檔案的指標讀出所有文章號,然後返回結果。詞典通常非常小,因而,整個過程的時間是毫秒級的。
而用普通的順序匹配演算法,不建索引,而是對所有文章的內容進行字串匹配,這個過程將會相當緩慢,當文章數目很大時,時間往往是無法忍受的。
整理自
lucene 工作原理之倒排索引
lucene倒排索引
Lucene 倒排索引機制
利用 lucene,在建立索引的工程中你可以充分利用機器的硬體資源來提高索引的效率。當你需要索引大量的檔案時,你會注意到索引過程的瓶頸是在往磁碟上寫索引檔案的過程中。為了解決這個問題,lucene 在記憶體中持有一塊緩衝區。但我們如何控制 lucene 的緩衝區呢?幸運的是,lucene 的類 in...
倒排索引原理
這裡介紹乙個基礎的搜尋引擎技術 假如有兩段文字 1,books and friends should be few but good 2,a good book is a good friend 假如我們忽略掉大小寫和複數,可以整理出一張單詞表,顯示哪個單詞再哪段文字,英文單詞 文章編號a2 and...
elasticsearch 倒排索引原理
elasticsearch 使用一種稱為 倒排索引 的結構,它適用於快速的全文搜尋。乙個倒排索引由文件中所有不重複詞的列表構成,對於其中每個詞,有乙個包含它的文件列表。例如,假設我們有兩個文件,每個文件的content域包含如下內容 the quick brown fox jumped over t...