elasticsearch索引原理

Mr-Wanter發表於2019-03-07

多渠道簡單理解elasticsearch的索引原理:

正排索引

ID

內容

1

elasticsearch是最火爆的分散式搜尋引擎

2

java是世界上最好的語言

3

搜尋引擎是如何誕生的

 倒排索引:將欄位內容進行分詞後以一下形式進行索引儲存

索引詞元 文件ids
elasticsearch 1
火爆 1
分散式 1
搜尋引擎 1,3
java 2
世界 2
最好 2
語言 2
如何 3
誕生 3

倒排列表:以"搜尋引擎"為例

文件ID TF(詞頻) position(位置) offset(偏移量)
1 1 3 <21,25>
3 1 0 <0,4>

Elasticsearch分別為每個field都建立了一個倒排索引,elasticsearch, 火爆, 分散式, 搜尋引擎這些叫term,當有成千上萬的term的時候,es是如何快速找到對應的索引呢?

Elasticsearch為了能快速找到某個term,將所有的term排個序,二分法查詢term,logN的查詢效率,就像通過字典查詢一樣,這就是Term Dictionary。

B-Tree通過減少磁碟尋道次數來提高查詢效能,Elasticsearch也是採用同樣的思路,直接通過記憶體查詢term,不讀磁碟,但是如果term太多,term dictionary也會很大,放記憶體不現實,於是有了Term Index,就像字典裡的索引頁一樣,A開頭的有哪些term,分別在哪頁,可以理解term index是一顆樹。

這棵樹不會包含所有的term,它包含的是term的一些字首。通過term index可以快速地定位到term dictionary的某個offset,然後從這個位置再往後順序查詢。

所以term index不需要存下所有的term,而僅僅是他們的一些字首與Term Dictionary的block之間的對映關係,再結合FST(Finite State Transducers)的壓縮技術,可以使term index快取到記憶體中。從term index查到對應的term dictionary的block位置之後,再去磁碟上找term,大大減少了磁碟隨機讀的次數。

利用倒排索引,進行搜尋的話,假設現在有100萬條資料,拆分出來的詞語,假設有1000萬個,那麼在倒排索引中,就有1000萬行,我們並不需要搜尋1000萬次,直接在Term index中快速定位即可,這樣我們就可以找到這個搜尋詞對應的資料。

參考:

https://blog.csdn.net/sdksdk0/article/details/78469190

https://www.cnblogs.com/dreamroute/p/8484457.html

相關文章