Elasticsearch(ES 7.x) 对子聚合的结果进行排序

简介

需要对于子聚合结果进行排序

系统版本

  • 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
        }

猜你喜欢

转载自blog.csdn.net/assember/article/details/118493199
今日推荐