天天看點

Elasticsearch的索引機制

作者:程式員小橙

我們在平常的學習中,常常接觸是MySQL資料庫的索引,今天介紹的Elasticsearch,它與MySQL的差别是非常大的。并且在很多方面遠遠強于MySQL。而且在這麼久的發展曆程中,Elasticsearch對索引進行很大的改進。真正做到了效率與節省空間一把抓。

介紹:

ES是開源的,是以它的可擴充性好,并且可以選擇HTTP網絡的接口互動。

在處理文本時,它首先建立一個索引,這樣耗時短,搜尋的效率會很高。ES不同于MySQL的是:它直接在記憶體中尋找文本位置。ES還可以完成一些比較難的操作,像複雜的組合查詢,而這是MySQL不能具備的。

索引:

ES和MySQL的概念:

Elasticsearch的索引機制

ES的反向索引機制,是它一個很特殊的機制,這使得它可以根據搜尋詞快速回報給你對應的文本。

Inverted Index

舉個例子:

  1. Winter is comng
  2. Ous is fury
  3. This choice is your
Elasticsearch的索引機制

Finite State Transducers

它的功能類似一個Trie字首樹,根據字首,我們就可以找到對應在文本中的位置。

根據下面已經排序好的一些詞和他們的編号,生成的狀态轉換圖:

Elasticsearch的索引機制

Posting Lists

當我們需要存儲資料時,ES會将資料存入不同的segment,它是一個很小的分片機關,segment會定期合并這些資料。

posting list,是全部term文檔的id的集合。ES會對這些文檔進行一個處理,使他們轉化成各個整型的id,并且不重複。

Roaring Bitmaps

Roaring bitmaps 在傳統 bitmaps 上, 使用壓縮解決數組稀疏問題.具體上講, Roaring bitmaps 将1個 32 位整數集合, 按照高 16 位分桶(container),最多可分 個桶. 存儲整數時,按照整數的高16位找到container(找不到就會建立一個),再将整數的低16位放入 container 中. 常見的 container 有一下2類:

  1. ArrayContainer

    當桶内資料的個數不大于4096時,會采用它來存儲,其本質上是一個unsigned short類型(正好 16 位)的有序數組:Array[Short]。數組初始長度為4,随着資料的增多會自動擴容(但數組的最大長度就是4096, 即 ArrayContainer 最大占用從初始的 4 * 2B=8B, 到最大 4096 * 2B = 8KB)。另外還維護有一個計數器,用來實時記錄基數。

  2. BitmapContainer

    當桶内資料的個數大于4096時,會采用它來存儲,其本質上是長度固定為 位(8KB)的傳統 bitmap (存儲 個整數) 1實體表現為 長度固定為 1024 的 unsigned long型(64位,8B)數組:Array[Long] (size=1024),亦即這些位圖的大小固定 8KB。它同樣有一個計數器。

Elasticsearch的索引機制

總結

ES的效率很高,功能好用,節省時間。

反向索引可以很精準高效的根據關鍵詞回報給你結果。

如果索引數量多,為了效率高,ES需要建立詞典索引,建構有限狀态轉換器。

ES使用了索引幀技術壓縮posting list,可以節省大量的系統空間。

繼續閱讀