在Elasticsearch中,如果你尝试在一个count聚合中使用count聚合,你会遇到一个错误,提示count聚合必须是子聚合。这是因为count聚合是一个简单的计数聚合,它不能包含任何子聚合。
如果你需要对一个聚合结果进行计数,你应该使用另一种聚合类型,比如terms聚合,并在其内部进行count。以下是一个使用terms聚合的例子,它包含了一个子count聚合:
{
"aggs": {
"my_terms_agg": {
"terms": {
"field": "some_field"
},
"aggs": {
"my_count_agg": {
"value_count": {
"field": "some_other_field"
}
}
}
}
}
}
在这个例子中,my_terms_agg是一个terms聚合,它会按照some_field字段的值进行分组。每组内部,我们进行了一个value_count聚合(作为子聚合),它计算每组中some_other_field字段的非空值数量。这样,我们得到了分组后每组内的文档数量。
EasyEs 同理,这里必须作为 某个聚合的子聚合,例如:
//filter聚合
TermQueryBuilder orderNumFilter = QueryBuilders.termQuery("orderStatus", "settled");
AggregationBuilder orderNumAggr = AggregationBuilders.filter("orderNum", orderNumFilter)
.subAggregation(AggregationBuilders.count("orderNum").field("orderStatus"));
//terms 聚合
TermsAggregationBuilder awardIdAggregation = AggregationBuilders.terms("award_stats")
.field("awardId").subAggregation(AggregationBuilders.count("award_count").field("awardId"));