结绳记事,思考、记录,方有成长~
文章目录
1.前言
ElasticSearch的聚合(Aggregations)功能非常强大,允许在数据上做复杂的统计。聚合分析功能主要有指标聚合、桶聚合、管道聚合和矩阵聚合四大类,管道聚合和矩阵聚合官方说明是在试验阶段,后期会完全更改或者移除。以下demo会从restful接口、java的API接口及SQL含义3个层面来阐述ES的聚合概念。
size如何理解
2.指标聚合
即计算最大、最小、平均值、求和、计数等功能。比如统计最大值,统计books索引中的最高价格
# SQL描述
select max(price) as max_price from book;
GET books/_search
{
"size": 0,
"aggs": {
# 自定义的别名
"max_price": {
# 计算price字段的最大值,此处的max可以替换为min、avg、sum、cardinality(去重后计算个数)、stats(一次性返回所有的聚合指标)
"max": {"field": "price"}
}
}
}
# 结果
{
"aggregations": {
"max_price": {
"value": 81.4
}
}
}
# java API方式
public static void main(String[] args) {
MaxAggregationBuilder agg = AggregationBuilders.max("max_price").field("price");
SearchResponse sr = clent().prepareSearch("books").addAggregation(agg).get();
Max agg = sr.getAggregaion().get("max_price");
double value = agg.getValue();
System.out.println(value);
}
3.桶聚合
Bucket可以理解为一个桶,它会遍历文档中的内容,凡是符合某一要求的就放入一个桶中,分桶相当于SQL中的group by。以books索引中的图书为例,一本书会被划分到科技类、经济类或者其他分类中,name科技类图书就是一个桶,经济类图书也是一个桶,桶就是符合某一划分标准的文档集合。
3.1Terms Aggregation(聚合后计算总数)
Terms Aggregation用于分组聚合。例如,根据language字段对books索引中的文档进行分组,统计属于各种编程语言的书的数量,或者业务中常见的统计各状态数量的场景。
# 对应的SQL逻辑
select language as key, count(1) as per_count from books group by language
POST books/_search?size=0
{
"aggs": {
# 自定义的分组别名
"per_count": {
"terms": {
# 根据language分组
"field": "language"
}
}
}
}
# 结果
{
"aggregations": {
"per_count": {
"d