Elsticsearch為何搜尋速度如此之快?
阿新 • • 發佈:2018-12-15
之前一直在專案中使用elasticsearch,用的是spring-data-elasticsearch。一直在使用卻對搜尋原理一直不太清楚,最近在網上看了些相關資料,特此總結一下:
首先,ES用的是倒排索引,何為倒排索引,我的理解就是將document的id按照field的value彙集起來,下邊講個例子:
建立一個index,type=user,document的filed定義為:
{ _id: 1 name : fujian, age:28, sex: male, height:178cm }, { _id:2 name: jim, age:28, sex:male, height:180cm }
ok,當給上邊這個type建立倒排索引的核心就是:
name posting list
fujian 1
jim 2
age posting list
28 [1,2]
sex posting list
male [1,2]
height posting list
178cm 1
180cm 2
也就是,將每一個filed的在所有document中的可能值列舉出來,並將這些值出現在的document id 放在 posting list中,這樣 每當你檢索一個filed的value(比如 male)時,就會將對應的document id 找出([1,2]),從而將相應的document查找出來。
當然這只是倒排索引的核心思想,為了防止記憶體佔用過多,es的開發還定義了term index 和 term dictionary,term即filed對應的value。也就是說 term index儲存了 term 的字首 到 具體term value的對映關係,並且儲存在記憶體中。這樣就不必將所有的term dictionary 都放在記憶體中。通過 term index 定位到 term dictionary,然後再定位到posting list。
一般的mysql索引僅僅是 建立了 term dictionary 到 posting的對映,dictionary的建立是用了b-tree的排序方式,但es在這之前又添加了term index這一層,縮小了在dictionary上查詢的範圍,所以檢索速度更快了。