ElasticSearch7.X之桶聚合API教程
通过team查询每个team中的最小年龄
踩坑一:由于es7 API改动 下文注释地方不可用lambda表达式!获得value前必须先强转否则无法获取!
踩坑二:client没有了prepareSearch方法,所以必须按照文中方法调用API!
public void testQueryMinAgeByTeamName() throws IOException {
SearchRequest searchRequest = new SearchRequest("nba");
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
TermsAggregationBuilder field = AggregationBuilders.terms("teamName").field("teamName.keyword");
//第二个聚合
MinAggregationBuilder aggregation =
AggregationBuilders
.min("age")
.field("age");
TermsAggregationBuilder termsAggregationBuilder = field.subAggregation(aggregation);
searchSourceBuilder.aggregation(termsAggregationBuilder);
searchRequest.source(searchSourceBuilder);
SearchResponse search = client.search(searchRequest, RequestOptions.DEFAULT);
Aggregations aggregations = search.getAggregations();
//此处不要用lambda表达式,因为下文注释es7,必须有这一步强转。
//读者可以实验,会发现v处在lambda表达式中无法强转。
// Terms terms = (Terms) aggregations ;
// terms.getBuckets().forEach( bucket ->
// bucket.getAggregations().asMap().forEach((k,v) ->
// System.out.println(bucket.getKeyAsString()+"---" +k + "->" + ((SingleValue)v).value()))
// );
for(Aggregation a:aggregations){
Terms terms = (Terms) a;
for(Terms.Bucket bucket:terms.getBuckets()){
System.out.println("key is "+bucket.getKeyAsString());
//这里是elasticsearch7的重大改动!!!!必须强转。
Min age = (Min) bucket.getAggregations().asMap().get("age");
double value = age.getValue();
System.out.println("age is "+value);
}
}
}