Elasticsearch-聚合
作用范围
query
默认是这个范围
filter
可以将filter条件直接放入到一个聚合分析中,则只对该聚合分析起作用
post_filter
对聚合分析不起作用,但是会对查询结果起作用
global
query的查询条件对global修饰的聚合分析不起作用
精准度
受三个条件的制约:数据量、精确度和实时性。
在ES中会优先满足数据量和实时性,因此会采取一些近似计算来牺牲精确度。
并且针对不同的聚合类型,精准度也是有差异的。
比如最小值的聚合分析,因为每个节点都是返回最小值,最小值之间最小值肯定就是没有错误的。
但是对于Term聚合的top聚合就会有很大的问题,因为一个分片的topN对于另一个分片并不是这样,并且由于不同分片的数量级的差别,导致topN的最后几个数据可能并不是准的。
要注意doc_count_error_upper_bound和sum_other_doc_count这两个参数的值,如果不为0,则可能出现结果不准的情况。
解决办法
1、主分片设为1
2、提高shard_size,也就是每个分片top的数据量大于N,一般谁N*1.5+10,尽量保证doc_count_error_upper_bound值为0.
聚合分类
bucket聚合
就是分组聚合,分组可以嵌套
Pipline聚合
也就是对聚合分析结果再进行指标聚合分析,可以进行最大、最小、累计求和、求导等处理。
聚合优化
广度和深度优先
广度优先就是会先计算出所有的分组情况,也是默认采取的方法,针对分组不是很多并且每个分组的数据量很大的情况,比如时间月份,年份等大部分情况下都适合
深度优先就是并不会计算出所有分组情况,会优先计算优先级较大的分组情况,针对分组较多而每个分组数据量不大的topN情况