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