Bucket聚合(桶聚合)
对文档做分组,aggs
按照文档字段值或日期进行分组,能参与分词的字段不能做聚合,如text类型的字段
例如:根据城市名称做聚合,也就是城市名称对数据进行分组统计。可以加query查询条件,也可以加原数据返回条数size,使用_order对聚合结果按条数进行倒叙排序
GET _search
{"query": {"range": {"price": {"gte": 100,"lte": 500}}}, "size": 1,"aggs": {"cityAgg": {"terms": {"field": "city","order": {"_count": "desc"},"size": 2}}}
}
从返回结果可以看出原文档数据并没有返回,分组统计结果也只有规定的两条数据
解释:
GET _search
{"size": 0, #size为0表示不显示原文档数据"aggs": { #聚合"cityAgg": {"terms": { #聚合类型,根据城市聚合,是keyword所以选择term"field": "city", #字段名"size": 2 #获取的聚合结果数量,这里只获取聚合结果的前2条数据}}}
}
Metric聚合(度量聚合)
在桶聚合结果中获取某个字段值的最大值max、最小值min、平均值avg、求和sum等
例如:在上述统计结果,获取评分score字段的最大值max、最小值min、平均值avg、求和sum,加上与terms同级的aggs条件
"term":{...},
"aggs": {"score_stats": {"stats": {"field": "score"}}}
GET _search
{"query": {"range": {"price": {"gte": 100,"lte": 500}}}, "size": 1,"aggs": {"cityAgg": {"terms": {"field": "city","order": {"_count": "desc"},"size": 2}, "aggs": {"score_stats": {"stats": {"field": "score"}}}}}
}
score_count为自定义名字
如果要根据score_count中的结果进行排序,可以在桶聚合中加:
#根据最大值倒叙排序"order": {"score_stats.max": "desc"},
RestAPI实现聚合
聚合条件与query条件同级别,因此需要使用request.source()来指定聚合条件。
request.source()去点
//1.准备RequestSearchRequest request = new SearchRequest("jungle_study");request.source().size(0); //聚合不需要返回具体数据,只需要统计数量request.source().aggregation(AggregationBuilders.terms("cityAgg").field("city").size(10)); //聚合条件,统计城市数量,最多10个//3.发生请求SearchResponse response = client.search(request, RequestOptions.DEFAULT);//处理相应结果Terms cityAgg = response.getAggregations().get("cityAgg");//获取聚合结果cityAgg.getBuckets().forEach(bucket -> {System.out.println(bucket.getKey() + ":" + bucket.getDocCount());});
Terms:
import org.elasticsearch.search.aggregations.bucket.terms.Terms;
聚合的官方文档:聚合 |Elasticsearch 指南 [8.13] |弹性的 --- Aggregations | Elasticsearch Guide [8.13] | Elastic