查询指定队伍数据,并返回此队伍的平均年龄的聚合查询结果。
kibana查询语句:
POST /nba/_search
{
"query": {
"term": {
"teamNameEn": {
"value": "Rockets"
}
}
},
"aggs": {
"avgAge": {
"avg": {
"field": "age"
}
}
},
"size": 0
}
下面是代码实现
@Test
public void test01() throws IOException {
SearchRequest searchRequest = new SearchRequest("nba");
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
//限定了查询的队伍名称
searchSourceBuilder.query(QueryBuilders.termQuery("teamName.keyword","火箭")).size(100);
TermsAggregationBuilder field = AggregationBuilders.terms("teamName").field("teamName.keyword").size(200);
AvgAggregationBuilder avgAggregationBuilder = AggregationBuilders.avg("age").field("age");
TermsAggregationBuilder termsAggregationBuilder = field.subAggregation(avgAggregationBuilder);
searchSourceBuilder.aggregation(termsAggregationBuilder);
searchRequest.source(searchSourceBuilder);
SearchResponse search = client.search(searchRequest, RequestOptions.DEFAULT);
//下面是查出火箭队所有球员
SearchHit[] hits = search.getHits().getHits();
List<NBAPlayer> playerList = new LinkedList<>();
for(SearchHit hit: hits){
NBAPlayer player = JSONObject.parseObject(hit.getSourceAsString(),NBAPlayer.class);
player.setId( Integer.parseInt(hit.getId()));
playerList.add(player);
System.out.println(player.toString());
}
//下面获得聚合查询
Aggregations aggregations = search.getAggregations();
for(Aggregation a:aggregations){
Terms terms = (Terms) a;
for(Terms.Bucket bucket:terms.getBuckets()){
System.out.println("key is "+bucket.getKeyAsString());
Avg age = (Avg)bucket.getAggregations().asMap().get("age");
double value = age.getValue();
System.out.println("Avg age is "+value);
}
}
}