Validation Failed: 1: No aggregation found for path [xx>yyy]

ES嵌套聚合查询时出现No aggregation found for path [xx>yyy]的异常

常见错误CheckList

  1. 真的是路径写错了
  2. 可能是嵌套聚合的结构不对。(我遇到的情况)

正确的写法鉴赏

例子说明:聚合查询各班级男女性别的身高总和。(纯属举例)

  • 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));

说重点

  1. buckets_path 语法:(api中是bucketsPath)它的是聚合对象的别名拼接的,中间是 > 。之间可以有空格。这是语法。
  2. 层级结构一定是从外层聚合,层层向内,所以是路径嘛。一定要检查。
  3. 针对嵌套聚合结果的求和,java api PipelineAggregatorBuilders的位置与 es 指令中的是一样样的。
  4. 但是如果一旦写错位置,就有可能会报上面的错误哦。
  • 指令中的写法是嵌套在aggs里面。
    在这里插入图片描述 - 但下面的写法是错误的。就会报 buckets_path 找不到。编译时,不会报错。
    在这里插入图片描述
    错误之处在于,sex_agg -> height_sum的聚合,是在外层class_agg里面,如果需要根据这个路径求聚合总数,应该写成 class_agg的 subAggregation,而不是写到里面哦!

  • 正确的写法:
    在这里插入图片描述

上面的问题算是一个低级错误。但是全网没有对此报错的描述。特别记录一下,方便遇到同样错的同学,能及时解决。

大家有什么新问题,欢迎在评论区留言讨论。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值