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情况

posted on 2020-03-28 11:26  simple_孙  阅读(150)  评论(0编辑  收藏  举报

导航