ElasticSearch查詢之聚合查詢

一、ES的demo數據如下:

二、簡單聚合,獲得平均分

GET /student/student/_search
{
  "aggs": {
    "avg_score": {
      "avg": {
        "field": "score"
      }
    }
  }
}

查詢結果:

java實現:

/**
 * 聚合查詢avg
 *
 *GET /student/student/_search
 * {
 *   "aggs": {
 *     "avg_score": {
 *       "avg": {
 *         "field": "score"
 *       }
 *     }
 *   }
 * }
 *
 */
@ResponseBody
@RequestMapping("/searchAvg")
public Double searchAvg(){
    AvgAggregationBuilder scoreQuery = AggregationBuilders.avg("avg_score");
    scoreQuery.field("score");
    System.out.println(scoreQuery);
    SearchQuery searchQuery = new NativeSearchQueryBuilder().withIndices("student").withTypes("student").addAggregation(scoreQuery).build();
    Aggregations aggregations = elasticsearchTemplate.query(searchQuery, new ResultsExtractor<Aggregations>() {
        @Override
        public Aggregations extract(SearchResponse response) {
            return response.getAggregations();
        }
    });
    Aggregation avg_score = aggregations.asMap().get("avg_score");
    System.out.println(avg_score.toString());
    ObjectMapper objectMapper = new ObjectMapper();
    Double avgScore=null;
    try {
        JsonNode jsonNode = objectMapper.readTree(avg_score.toString());
        avgScore=Double.parseDouble(jsonNode.get("avg_score").get("value").toString());
    } catch (IOException e) {
        e.printStackTrace();
    }
    return avgScore;
}

其他如sum,max,min如上類似

二、根據名字聚合獲得各自的所有成績的平均分

GET /student/student/_search
{
  "aggs": {
    "_result": {
      "terms": {
        "field": "name",
        "size": 10,
        "order": {
          "avg_score": "desc"
        }
      },
      "aggs": {
        "avg_score": {
          "avg": {
            "field": "score"
          }
        }
      }
    }
  }
}

查詢結果:

java實現:

/**
 * 聚合查詢 select avg(score)  group by name
 *
 */
@ResponseBody
@RequestMapping("/searchGroupBy")
public Double searchGroupBy(){
    TermsAggregationBuilder resultQuery = AggregationBuilders.terms("_result");
    resultQuery.field("name");//根據名字聚合
    resultQuery.size(10);//結果顯示10條
    resultQuery.order(BucketOrder.aggregation("avg_score",false));//按照avg_score分數降序排

    AvgAggregationBuilder scoreQuery = AggregationBuilders.avg("avg_score");
    scoreQuery.field("score");//聚合查詢平均分
    SearchQuery searchQuery = new NativeSearchQueryBuilder().withIndices("student").withTypes("student").addAggregation(resultQuery.subAggregation(scoreQuery)).build();
    Aggregations aggregations = elasticsearchTemplate.query(searchQuery, new ResultsExtractor<Aggregations>() {
        @Override
        public Aggregations extract(SearchResponse response) {
            return response.getAggregations();
        }
    });
    System.out.println(aggregations);
    Aggregation avg_score = aggregations.asMap().get("_result");
    System.out.println(avg_score.toString());//已經有查詢數據返回
    return null;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章