關於倒排索引表的總結

2021-09-24 18:38:30 字數 2450 閱讀 5644

最近在研究elasticsearch的技術棧 ,發現es底層是基於luence技術進行檢索,檢索的原理是倒排索引表。那麼什麼是倒排索引表呢?在知乎上看到乙個講解elasticsearch的倒排索引表的帖子。

為什麼說elasticsearch的倒排索引表的檢索速度是比關係型資料庫的索引查新更快呢?首先,關係型資料庫的底層索引的資料結構是b-tree樹, b-tree樹最大的缺點就是犧牲了一定的讀取的效率換來更高的寫入效率。當我們不需要支援快速的更新的時候,可以用預先排序等方式換取更小的儲存空間,更快的檢索速度等好處,其代價就是更新慢。要進一步深入的化,還是要看一下lucene的倒排索引是怎麼構成的。

首先介紹乙個簡單的例子。

比如有如下的資料:

在es中每一行對應著乙個document, 每個文件都是有docid的,而且我們現在是針對document來建立倒排索引操作。

這裡面的倒排索引是針對每乙個字段 其中18,20叫做term ,[1,2]就是post list.

那麼term index 和term dictionary 是什麼呢?

假設我們有很多個term,比如:

carla,sara,elin,ada,patty,kate,selena

如果按照這樣的順序排列,找出某個特定的term一定很慢,因為term沒有排序,需要全部過濾一遍才能找出特定的term。排序之後就變成了:

ada,carla,elin,kate,patty,sara,selena

這樣我們可以用二分查詢的方式,比全遍歷更快地找出目標的term。這個就是 term dictionary。有了term dictionary之後,可以用 logn 次磁碟查詢得到目標。但是磁碟的隨機讀操作仍然是非常昂貴的(一次random access大概需要10ms的時間)。所以盡量少的讀磁碟,有必要把一些資料快取到記憶體裡。但是整個term dictionary本身又太大了,無法完整地放到記憶體裡。於是就有了term index。term index有點像一本字典的大的章節表。比如:

a開頭的term ……………. ***頁

c開頭的term ……………. ***頁

e開頭的term ……………. ***頁

如果所有的term都是英文本元的話,可能這個term index就真的是26個英文本元表構成的了。但是實際的情況是,term未必都是英文本元,term可以是任意的byte陣列。而且26個英文本元也未必是每乙個字元都有均等的term,比如x字元開頭的term可能乙個都沒有,而s開頭的term又特別多。實際的term index是一棵trie 樹:

例子是乙個包含 "a", "to", "tea", "ted", "ten", "i", "in", 和 "inn" 的 trie 樹。這棵樹不會包含所有的term,它包含的是term的一些字首。通過term index可以快速地定位到term dictionary的某個offset,然後從這個位置再往後順序查詢。再加上一些壓縮技術(搜尋 lucene finite state transducers) term index 的尺寸可以只有所有term的尺寸的幾十分之一,使得用記憶體快取整個term index變成可能。整體上來說就是這樣的效果。

現在我們可以回答說「為什麼elasticsearch/lucene 比mysql的檢索速度快了?」 其實對於mysql來說的話 他缺少了term index這一層, 在寫入資料的時候是按照b-tree的結構進行排序寫入磁碟的。當檢索乙個term的時候需要若干次的磁碟random access操作這樣效率就比較低(一次random access的時間消耗大約是10ms)。然而對於lucene來說的話 分裝了一層term index,並且term index按照trie樹的結果在記憶體中,從term index查到對應的term dictionary的block位置之後,再去磁碟上找term,大大減少了磁碟的random access次數。

額外值得一提的兩點是:term index在記憶體中是以fst(finite state transducers)的形式儲存的,其特點是非常節省記憶體。term dictionary在磁碟上是以分block的方式儲存的,乙個block內部利用公共字首壓縮,比如都是ab開頭的單詞就可以把ab省去。這樣term dictionary可以比b-tree更節約磁碟空間。

關於elasticsearch資料壓縮的技術---"增量編碼壓縮 就是將大數變成小數 按照位元組儲存"

關於倒排索引

今天讀到關於倒排索引的乙個超級棒的部落格,忍不住複製了過來。單詞 文件矩陣是表達兩者之間所具有的一種包含關係的概念模型,圖3 1展示了其含義。圖3 1的每列代表乙個文件,每行代表乙個單詞,打對勾的位置代表包含關係。圖3 1 單詞 文件矩陣 從縱向即文件這個維度來看,每列代表文件包含了哪些單詞,比如文...

關於倒排索引

通常的儲存方式 乙個未經處理的資料庫中,一般是以文件id作為索引,以文件內容作為記錄。lucene是基於倒排索引實現的。英語 inverted index 特點適合快速的全文檢索 乙個倒排索引由文件中所有不重複詞的列表構成,對於其中每個詞,有乙個包含它的文件列表。也常被稱為反向索引 置入檔案或反向檔...

ElasticSearch關於倒排索引

在我們說倒排索引的時候讓我們先去了解一下什麼叫做正排索引 在說倒排索引之前我們先說說什麼是正排索引。正排索引也稱為 前向索引 它是建立倒排索引的基礎。這種組織方法在建立索引的時候結構比較簡單,建立比較方便且易於維護 因為索引是基於文件建立的,若是有新的文件加入,直接為該文件建立乙個新的索引塊,掛接在...