简介
需要对于子聚合结果进行排序
系统版本
- ES版本: 7.X
- Java API : RestHighLevelClient
DSL
POST appraisal/_search
{
"size": 0,
"aggregations": {
"sub-code": {
"terms": {
"field": "org_code",
"size": 20,
"min_doc_count": 1,
// 这里指定排序,按照子聚合 avg 降序排序
// 在子聚合值相同的情况下,按照当前聚合的key进行升序排序
"order": [
{
"avg": "desc"
},
{
"_key": "asc"
}
]
},
"aggregations": {
"avg": {
"avg": {
"field": "level"
}
}
}
}
}
}
JAVA 代码
SearchRequest searchRequest = new SearchRequest("index_name");
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
searchSourceBuilder.size(0);
TermsAggregationBuilder termsAggregationBuilder = AggregationBuilders.terms("sub-code");
termsAggregationBuilder.field("org_code")
// 取前 top 20
.size(20)
// 按照子聚合进行排序
.order(BucketOrder.aggregation("avg", false));
termsAggregationBuilder.subAggregation(AggregationBuilders.avg("avg").field("level"));
// 构建查询
searchSourceBuilder.aggregation(termsAggregationBuilder);
searchRequest.source(searchSourceBuilder);
SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
// 解析结果
Terms terms = searchResponse.getAggregations().get("sub-code");
for (Terms.Bucket bucket : terms.getBuckets()) {
Avg averageAge = bucket.getAggregations().get("avg");
double value = averageAge.getValue();
// 防止没有拿到值返回 infinite
if (Double.isInfinite(value)) {
value = 0;
}
// 得到 value
}