elasticsearch 聚合搜索(2)

在200ms以內的,有百分之多少,在1000毫秒以內的有百分之多少

如果想要percentile算法越精準,compression可以設置的越大

如果的確不需要doc value,比如聚合等操作,那麼可以禁用,減少磁盤空間佔用

如果要對分詞的field執行聚合操作,必須將fielddata設置爲true

打開fielddata,然後將正排索引數據加載到內存中,纔可以對分詞的field執行聚合操作,而且會消耗很大的內存

fielddata加載到內存的過程是lazy加載的,對一個analzyed field執行聚合時,纔會加載,

indices.fielddata.cache.size: 20%,超出限制,清除內存已有fielddata數據
fielddata佔用的內存超出了這個比例的限制,那麼就清除掉內存中已有的fielddata數據
默認無限制,限制內存使用,但是會導致頻繁evict和reload,大量IO性能損耗,以及內存碎片和gc

監控fielddata內存使用

GET /_stats/fielddata?fields=*
GET /_nodes/stats/indices/fielddata?fields=*
GET /_nodes/stats/indices/fielddata?level=indices&fields=*

circuit breaker

如果一次query load的feilddata超過總內存,就會oom --> 內存溢出

circuit breaker會估算query要加載的fielddata大小,如果超出總內存,就短路,query直接失敗

indices.breaker.fielddata.limit:fielddata的內存限制,默認60%
indices.breaker.request.limit:執行聚合的內存限制,默認40%
indices.breaker.total.limit:綜合上面兩個,限制在70%以內

min:僅僅加載至少在1%的doc中出現過的term對應的fielddata

比如說某個值,hello,總共有1000個doc,hello必須在10個doc中出現,那麼這個hello對應的fielddata纔會加載到內存中來

min_segment_size:少於500 doc的segment不加載fielddata

加載fielddata的時候,也是按照segment去進行加載的,某個segment裏面的doc數量少於500個,那麼這個segment的fielddata就不加載

一般不會去設置它,大家知道就好

 

 

fielddata預加載:

query-time的fielddata生成和加載到內存,變爲index-time,建立倒排索引的時候,會同步生成fielddata並且加載到內存中來,這樣的話,對分詞field的聚合性能當然會大幅度增強

 

序號標記預加載   global ordinal原理解釋