ES嵌套聚合查询时出现No aggregation found for path [xx>yyy]的异常
常见错误CheckList
- 真的是路径写错了
- 可能是嵌套聚合的结构不对。(我遇到的情况)
正确的写法鉴赏
例子说明:聚合查询各班级男女性别的身高总和。(纯属举例)
- ES查询语句写法:
"aggs": { "class_agg": { //聚合1: 班级 "terms": { "field": "calssId" }, "aggs": { "sex_agg": { // 嵌套聚合1:性别 "terms": { "field": "sex" }, "aggs": { "height_sum": { // 嵌套聚合2:身高 "sum": { "field": "height" } } } }, "sum_total": { "sum_bucket": { "buckets_path": [ "sex_agg>height_sum" // 也可以去掉外面的方括号,在7.17版本是都可以执行的。 ] } }, "class_sort": { "bucket_sort": { "sort": [ { "sum_total": { "order": "desc" } } ] } } } } }
- RestHighLevelClient API写法
List<FieldSortBuilder> sortList = new ArrayList<>();
FieldSortBuilder sortBuilder = new FieldSortBuilder("sum_total").order(SortOrder.DESC);
sortList.add(sortBuilder);
TermsAggregationBuilder termsAgg =
AggregationBuilders.terms("class_agg").field("calssId")
.subAggregation(AggregationBuilders.terms("sex_agg").field("sex").order(BucketOrder.key(false))
.subAggregation(AggregationBuilders.sum("height_sum").field("height")))
.subAggregation(PipelineAggregatorBuilders.sumBucket("sum_total", "sex_agg>height_sum"))
.subAggregation(PipelineAggregatorBuilders.bucketSort("class_sort", sortList).size(10));
说重点
- buckets_path 语法:(api中是bucketsPath)它的是聚合对象的别名拼接的,中间是 > 。之间可以有空格。这是语法。
- 层级结构一定是从外层聚合,层层向内,所以是路径嘛。一定要检查。
- 针对嵌套聚合结果的求和,java api PipelineAggregatorBuilders的位置与 es 指令中的是一样样的。
- 但是如果一旦写错位置,就有可能会报上面的错误哦。
-
指令中的写法是嵌套在aggs里面。
- 但下面的写法是错误的。就会报 buckets_path 找不到。编译时,不会报错。
错误之处在于,sex_agg -> height_sum的聚合,是在外层class_agg里面,如果需要根据这个路径求聚合总数,应该写成 class_agg的 subAggregation,而不是写到里面哦! -
正确的写法:
上面的问题算是一个低级错误。但是全网没有对此报错的描述。特别记录一下,方便遇到同样错的同学,能及时解决。
大家有什么新问题,欢迎在评论区留言讨论。