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.准备Request
SearchRequest 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