聚合查询的官网地址
Aggregations | Elasticsearch Guide [7.0] | Elastic
聚合查询主要分为四类
Metrics Aggregations -- 指标聚合
Bucket Aggregations -- 桶聚合
Pipeline Aggregations -- 管道聚合
Matrix Aggregations -- 矩阵聚合
Metrics Aggregations
Sum Aggregations 求和
相当于sql sum()函数
POST /sales/_search?size=0
{"query" : {"constant_score" : {"filter" : {"match" : { "type" : "hat" }}}},"aggs" : {"hat_prices" : { "sum" : { "field" : "price" } }}
}
AggregationBuilder aggBuilder = AggregationBuilders.sum("hat_prices").field("price");searchSourceBuilder.aggregation(aggBuilder);searchRequest.source(searchSourceBuilder);SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);Aggregations aggregations = searchResponse.getAggregations();Sum sumAgg = aggregations.get("hat_prices");
return (long) sumAgg.getValue();
Cardinality Aggregations 统计去重后行数
相当于sql 的count(distinct(0)) 函数使用
注意:只能求查询结果集的计数,聚合后的结果集的计数统计不了
POST /sales/_search?size=0
{"aggs" : {"type_count" : {"cardinality" : {"field" : "type"}}}
}
CardinalityAggregationBuilder aggBuilder = AggregationBuilders.cardinality("type_count").field("type");searchSourceBuilder.aggregation(aggBuilder);searchRequest.source(searchSourceBuilder);SearchResponse cardinality = client.search(searchRequest, RequestOptions.DEFAULT);
Cardinality aggResult = cardinality.getAggregations().get("type_count");
return aggResult.getValue();
聚合之间能嵌套聚合
group by 和having 结合使用
使用了Mettics Aggregations 中的 terms aggregations 、sum aggregations和Pipeline Aggregations 中的 bucketSelector aggredations
聚合后的结果集计数,只能将size的值调整到较大值,获取桶的数量来获取计数结果
int size = result.getBuckets().size();
相当于sql
group by type
having sum(price) >= 100000
POST /sales/_search?size=0
"aggs": {"group_by_type": {"terms": {"field": "type","size": 100000 // 调整桶的大小},"aggs": {"sum_price": {"sum": {"field": "price"}},"having_sum_price": {"bucket_selector": {"buckets_path": {"_velue0": "sum_price"},"script": "params._value0 >= 100000"}}}}
searchSourceBuilder.aggregation(AggregationBuilders.terms("group_by_type").field("type").size(100000).subAggregation(AggregationBuilders.sum("sum_price").field("price")).subAggregation(PipelineAggregatorBuilders.bucketSelector("having_sum_price", new Script("params._value0 >= 100000"), "sum_price")));searchRequest.source(searchSourceBuilder);SearchResponse cardinality = client.search(searchRequest, RequestOptions.DEFAULT);Terms result = cardinality.getAggregations().get("group_by_type");