Elasticsearch聚合联用composite与sum_bucket报类型重复错误解决方法
错误根因
- 语法错误:原查询JSON结构不合法,同一聚合节点
my_buckets_sale下同时声明了composite、date_histogram、sum_monthly_sales多个聚合类型,Elasticsearch规定单个聚合节点只能定义一种聚合类型,直接触发类型重复定义报错。 - 版本限制:Elasticsearch 6.1版本中,
composite聚合本身不支持被sum_bucket这类管道聚合直接引用。composite聚合设计目的是支持大量分桶的分页遍历,6.x版本的返回结构未做管道聚合适配,无法直接在服务端通过sum_bucket计算全部分桶的数值总和。
实现方案(保留composite配置)
客户端侧累加计算(6.1版本最优方案)
完全保留原有composite聚合的分页配置,在遍历全部分页结果的过程中完成总和计算,无版本兼容问题:
- 保留composite聚合的原有配置,每次请求携带上一页返回的
after_key参数拉取下一页分桶 - 每拉取到一页结果,将当前页所有分桶下
sales聚合的value值累加到全局总和变量 - 当返回结果中不再携带
after_key字段时,代表所有分桶遍历完成,此时全局累加值即为所有分桶的数值总和
服务端聚合结构调整(仅高版本ES兼容,6.1版本不可用)
如果升级到7.x及以上支持composite被管道聚合引用的版本,可以将sum_bucket调整为和composite聚合平级的节点,修正后的查询结构如下:
{ "size": 0, "aggs": { "my_buckets_sale": { "composite": { "size": 4, "sources": [ { "date": { "date_histogram": { "field": "@timestamp", "interval": "day" } } } ] }, "aggs": { "sales": { "sum": { "field": "price" } } } }, "sum_monthly_sales": { "sum_bucket": { "buckets_path": "my_buckets_sale>sales" } } } }
注意:上述结构在Elasticsearch 6.1版本中依然会抛出兼容性错误,6.1环境下请使用客户端累加方案。
内容的提问来源于stack exchange,提问作者Florian
相关产品推荐
相关产品推荐

