結(jié)構(gòu)化搜索_filter執(zhí)行原理深度剖析(bitset機(jī)制與caching機(jī)制)

(1)在倒排索引中查找搜索串,獲取document list

date來舉例

word doc1 doc2 doc3
2017-01-01 * 0 *
2017-02-02 0 * *
2017-03-03 * * *

filter:2017-02-02

到倒排索引中一找,發(fā)現(xiàn)2017-02-02對(duì)應(yīng)的document list是doc2,doc3

(2)為每個(gè)在倒排索引中搜索到的結(jié)果,構(gòu)建一個(gè)bitset,[0, 0, 0, 1, 0, 1]

非常重要

使用找到的doc list,構(gòu)建一個(gè)bitset,就是一個(gè)二進(jìn)制的數(shù)組,數(shù)組每個(gè)元素都是0或1,用來標(biāo)識(shí)一個(gè)doc對(duì)一個(gè)filter條件是否匹配,如果匹配就是1,不匹配就是0

[0, 1, 1]

doc1:不匹配這個(gè)filter的
doc2和do3:是匹配這個(gè)filter的

盡可能用簡單的數(shù)據(jù)結(jié)構(gòu)去實(shí)現(xiàn)復(fù)雜的功能,可以節(jié)省內(nèi)存空間,提升性能

(3)遍歷每個(gè)過濾條件對(duì)應(yīng)的bitset,優(yōu)先從最稀疏的開始搜索,查找滿足所有條件的document

后面會(huì)講解,一次性其實(shí)可以在一個(gè)search請(qǐng)求中,發(fā)出多個(gè)filter條件,每個(gè)filter條件都會(huì)對(duì)應(yīng)一個(gè)bitset
遍歷每個(gè)filter條件對(duì)應(yīng)的bitset,先從最稀疏的開始遍歷

[0, 0, 0, 1, 0, 0]:比較稀疏
[0, 1, 0, 1, 0, 1]

先遍歷比較稀疏的bitset,就可以先過濾掉盡可能多的數(shù)據(jù)

遍歷所有的bitset,找到匹配所有filter條件的doc

請(qǐng)求:filter,postDate=2017-01-01,userID=1

postDate: [0, 0, 1, 1, 0, 0]
userID: [0, 1, 0, 1, 0, 1]

遍歷完兩個(gè)bitset之后,找到的匹配所有條件的doc,就是doc4

就可以將document作為結(jié)果返回給client了

(4)caching bitset,跟蹤query,在最近256個(gè)query中超過一定次數(shù)的過濾條件,緩存其bitset。對(duì)于小segment(<1000,或<3%),不緩存bitset。

比如postDate=2017-01-01,[0, 0, 1, 1, 0, 0],可以緩存在內(nèi)存中,這樣下次如果再有這個(gè)條件過來的時(shí)候,就不用重新掃描倒排索引,反復(fù)生成bitset,可以大幅度提升性能。

在最近的256個(gè)filter中,有某個(gè)filter超過了一定的次數(shù),次數(shù)不固定,就會(huì)自動(dòng)緩存這個(gè)filter對(duì)應(yīng)的bitset

segment(上半季),filter針對(duì)小segment獲取到的結(jié)果,可以不緩存,segment記錄數(shù)<1000,或者segment大小<index總大小的3%

segment數(shù)據(jù)量很小,此時(shí)哪怕是掃描也很快;segment會(huì)在后臺(tái)自動(dòng)合并,小segment很快就會(huì)跟其他小segment合并成大segment,此時(shí)就緩存也沒有什么意義,segment很快就消失了

針對(duì)一個(gè)小segment的bitset,[0, 0, 1, 0]

filter比query的好處就在于會(huì)caching,但是之前不知道caching的是什么東西,實(shí)際上并不是一個(gè)filter返回的完整的doc list數(shù)據(jù)結(jié)果。而是filter bitset緩存起來。下次不用掃描倒排索引了。

(5)filter大部分情況下來說,在query之前執(zhí)行,先盡量過濾掉盡可能多的數(shù)據(jù)

query:是會(huì)計(jì)算doc對(duì)搜索條件的relevance score,還會(huì)根據(jù)這個(gè)score去排序
filter:只是簡單過濾出想要的數(shù)據(jù),不計(jì)算relevance score,也不排序

(6)如果document有新增或修改,那么cached bitset會(huì)被自動(dòng)更新

postDate=2017-01-01,[0, 0, 1, 0]

document,id=5,postDate=2017-01-01,會(huì)自動(dòng)更新到postDate=2017-01-01這個(gè)filter的bitset中,全自動(dòng),緩存會(huì)自動(dòng)更新。postDate=2017-01-01的bitset,[0, 0, 1, 0, 1]

document,id=1,postDate=2016-12-30,修改為postDate-2017-01-01,此時(shí)也會(huì)自動(dòng)更新bitset,[1, 0, 1, 0, 1]

(7)以后只要是有相同的filter條件的,會(huì)直接來使用這個(gè)過濾條件對(duì)應(yīng)的cached bitset

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • 一、ES基于_version進(jìn)行樂觀鎖并發(fā)控制post /index/type/id/_update?retry_...
    timothyue1閱讀 1,218評(píng)論 0 1
  • 昨天夜里依舊香香的入睡了!清晨六點(diǎn)鐘醒來時(shí),發(fā)現(xiàn)眼角掛著兩滴眼淚,可是我卻笑了笑,但是我不知道是為什么,我...
    星星的眼眸閱讀 177評(píng)論 0 1
  • 在所有工作中有一個(gè)最神圣的職業(yè)--老師。在每個(gè)人的一生中總有幾位老師會(huì)讓你感到想要對(duì)她(他)說聲“謝謝!” ...
    蔓秋閱讀 181評(píng)論 0 1
  • 今天接到一個(gè)小任務(wù),做手工,內(nèi)心緊張1,不確定會(huì)做成什么樣子。就先去準(zhǔn)備。 先給大家看一個(gè)這樣的 哈哈哈,最后是這樣的
    雁攸寧的小九九閱讀 227評(píng)論 0 6
  • 能夠 (九寨溝地震有感) 能夠親手筑起自己的家, 能夠在黃昏之前喝幾罐啤酒, 能夠望著來往的游客, 聽聽他們的嬉...
    禪十七閱讀 370評(píng)論 2 11