1. 程式人生 > >2_ElatisSearch filter執行原理 bitset機制與caching機制

2_ElatisSearch filter執行原理 bitset機制與caching機制

2_ElatisSearch filter執行原理 bitset機制與caching機制

更多幹貨

1、倒排索引

在倒排索引中查詢搜尋串,獲取document list

  • 用時間型別date作為filter來舉例, filter:2017-02-02
  • 例子一:倒排索引如下:
word		doc1		doc2		doc3
2017-01-01	*		*
2017-02-02			*		*
2017-03-03	*		*		*

到倒排索引中一找,發現2017-02-02對應的document list是doc2,doc3

2、構建一個bitset

為每個在倒排索引中搜索到的結果,構建一個bitset

  • 其中個bitset 如下,其中0表示未匹配,1 表示匹配
[0, 1, 1]
  • 使用找到的doc list,構建一個bitset,就是一個二進位制的陣列,陣列每個元素都是0或1,用來標識一個doc對一個filter條件是否匹配,如果匹配就是1,不匹配就是0
  • 例子一中的bitset結果:[0, 1, 1]
  • doc1:不匹配這個filter的* doc2和do3:是匹配這個filter的
  • 儘可能用簡單的資料結構去實現複雜的功能,可以節省記憶體空間,提升效能

3、過濾bitset

遍歷每個過濾條件對應的bitset,優先從最稀疏的開始搜尋,查詢滿足所有條件的document

  • 一次性可以在一個search請求中,發出多個filter條件,每個filter條件都會對應一個bitset
  • 遍歷每個filter條件對應的bitset,先從最稀疏的開始遍歷
[0, 0, 0, 1, 0, 0]:比較稀疏
[0, 1, 0, 1, 0, 1]
  • 先遍歷比較稀疏的bitset,就可以先過濾掉儘可能多的資料
  • 遍歷所有的bitset,找到匹配所有filter條件的doc
  • 請求:filter,postDate=2017-01-01,userID=1
postDate: [0, 0, 1, 1, 0, 0]
userID:   [0, 1, 0, 1, 0, 1]
  • 遍歷完兩個bitset之後,找到的匹配所有條件的doc,就是doc4
  • 就可以將document作為結果返回給client了

4、caching bitset

caching bitset

,跟蹤query,在最近256個query中超過一定次數的過濾條件,快取其bitset。對於小segment(<1000條,或<3%),不快取bitset。

  • 比如postDate=2017-01-01,[0, 0, 1, 1, 0, 0],可以快取在記憶體中,這樣下次如果再有這個條件過來的時候,就不用重新掃描倒排索引,反覆生成bitset,可以大幅度提升效能。
  • 在最近的256個filter中,有某個filter超過了一定的次數,次數不固定,就會自動快取這個filter對應的bitset
  • segment,filter針對小segment獲取到的結果,可以不快取,segment記錄數<1000,或者segment大小<index總大小的3%
  • segment資料量很小,此時哪怕是掃描也很快;segment會在後臺自動合併,小segment很快就會跟其他小segment合併成大segment,此時就快取也沒有什麼意義,segment很快就消失了。針對一個小segment的bitset,[0, 0, 1, 0]
  • filter比query的好處就在於會caching,但是之前不知道caching的是什麼東西,實際上並不是一個filter返回的完整的doc list資料結果。而是filter bitset快取起來。下次不用掃描倒排索引了。

5、

filter大部分情況下來說,在query之前執行,先儘量過濾掉儘可能多的資料

  • query:是會計算doc對搜尋條件的relevance score,還會根據這個score去排序
  • filter:只是簡單過濾出想要的資料,不計算relevance score,也不排序

6、

如果document有新增或修改,那麼cached bitset會被自動更新

postDate=2017-01-01,[0, 0, 1, 0]
document,id=5,postDate=2017-01-01,會自動更新到postDate=2017-01-01這個filter的bitset中,全自動,快取會自動更新。postDate=2017-01-01的bitset,[0, 0, 1, 0, 1]
document,id=1,postDate=2016-12-30,修改為postDate-2017-01-01,此時也會自動更新bitset,[1, 0, 1, 0, 1]

7、

以後只要是有相同的filter條件的,會直接來使用這個過濾條件對應的cached bitset

相關內容