es---內核原理

一、倒排索引

1、倒排索引的結構

(1)包含這個關鍵詞的document list
(2)包含這個關鍵詞的所有document的數量:IDF(inverse document frequency)
(3)這個關鍵詞在每個document中出現的次數:TF(term frequency)
(4)這個關鍵詞在這個document中的次序
(5)每個document的長度:length norm
(6)包含這個關鍵詞的所有document的平均長度

word        doc1        doc2
dog           *             *
hello          *
you                          *

2、倒排索引不可變的好處

(1)不需要鎖,提升併發能力,避免鎖的問題
(2)數據不變,一直保存在os cache中,只要cache內存足夠
(3)filter cache一直駐留在內存,因爲數據不變
(4)可以壓縮,節省cpu和io開銷

3、倒排索引不可變的壞處

每次都要重新構建整個索引

 

二、doc的增、刪、改

1、doc寫入流程
(1)數據寫入buffer緩衝和translog日誌文件
(2)每隔一秒鐘,buffer中的數據被寫入新的segment file,並進入os cache,此時segment被打開並供search使用
(3)buffer被清空
(4)重複1~3,新的segment不斷添加,buffer不斷被清空,而translog中的數據不斷累加
(5)當translog長度達到一定程度的時候,commit操作發生
  (5-1)buffer中的所有數據寫入一個新的segment,並寫入os cache,打開供使用
  (5-2)buffer被清空
  (5-3)一個commit ponit被寫入磁盤,標明瞭所有的index segment
  (5-4)filesystem cache中的所有index segment file緩存數據,被fsync強行刷到磁盤上
  (5-5)現有的translog被清空,創建一個新的translog

2、數據寫入os cache,並被打開供搜索的過程,叫做refresh,默認是每隔1秒refresh一次。也就是說,每隔一秒就會將buffer中的數據寫入一個新的index segment file,先寫入os cache中。所以,es是近實時的,數據寫入到可以被搜索,默認是1秒。

3、基於translog和commit point,進行數據恢復

4、fsync+清空translog,就是flush,默認每隔30分鐘flush一次,或者當translog過大的時候,也會flush
POST /my_index/_flush,一般來說別手動flush,讓它自動執行就可以了

5、translog,每隔5秒被fsync一次到磁盤上。在一次增刪改操作之後,當fsync在primary shard和replica shard都成功之後,那次增刪改操作纔會成功
但是這種在一次增刪改時強行fsync translog可能會導致部分操作比較耗時,也可以允許部分數據丟失,設置異步fsync translog
PUT /my_index/_settings
{
    "index.translog.durability": "async",
    "index.translog.sync_interval": "5s"
}

6、merge segment
每秒一個segment file,文件過多,而且每次search都要搜索所有的segment,很耗時
默認會在後臺執行segment merge操作,在merge的時候,被標記爲deleted的document也會被徹底物理刪除
POST /my_index/_optimize?max_num_segments=1,儘量不要手動執行,讓它自動默認執行就可以了

每次merge操作的執行流程: (1)選擇一些有相似大小的segment,merge成一個大的segment (2)將新的segment flush到磁盤上去 (3)寫一個新的commit point,包括了新的segment,並且排除舊的那些segment (4)將新的segment打開供搜索 (5)將舊的segment刪除