概念
ElasticSearch 中聚合的概念,通俗的讲就是按照一些条件从一个数据集中去统计一些信息,比如统计酒店房间有多少,根据价格区间统计酒店数量这些功能。
官网的解释:聚合可以进行各种组合以构建复杂的数据汇总。可以看作是在一组文档上建立分析信息的工作单元,统计一些文档集。聚合可以将一些独立的功能单元可以被混合在一起来满足你的需求,是一种单独的语法。
kibana的可视化看板就是非常经典的聚合功能的体现。
上图中的每个看板视图的展示,其实都是通过聚合API统计出来的一些数据,比如直方图分布,数据泊松分布等特性。
聚合
ElasticSearch 中有许多不同类型的聚合,每种聚合都有自己的功能和输出,聚合类型大致有四种基本类型。
- Bucketing aggregation 一些满足特定条件的文档的集合,类似 mysql 的 group by。例如:select count(*) from user group by name, bucketing 的作用就是group by name,根据 name 去分组,返回一个特定条件的文档集合。
- Metric aggregation 一些数学运算,对文档进行统计分析,例如:select count(*) from user group by name,count 就是 Metric 的作用,对结果集进行一些计算处理。
- Matrix aggregation 对多个字段进行操作并且返回一个矩阵结果
- Pipeline aggregation 对已经产生的聚合结果进行二次聚合
聚合的基本语法
- aggs 是与query同级的,是聚合操作的根节点
- aggregation_name 是自定义的聚合名字,是在聚合结果中展示的字段名
- aggregation_type 是聚合的类型,比如 min,是 Metric 计算类型中的一种
- aggregation_body 一般是要操作的计算值,如果是脚本则是脚本
如上是一个简单的聚合语法,其中标识的地方分别对应语法中的操作。
Bucketing aggregation
bucketing的作用就是将文档进行一个分组,也就是 bucketing 的字面意思桶,ElasticSearch会将文档分成划分成为一个个的桶,ElasticSearch 提供了很多类型的 bucketing。
Terms Aggregation
就是一个最简单的分桶策略,也就是group by 策略,他是精确匹配,根据你指定的字段将值相等的文档分在一个桶中。
terms 是精确匹配,也是不分词,所以如果你想要对 text类型的使用terms,需要将field_data 开启
POST kibana_sample_data_flights/_search
{
"size": 0,
"aggs": {
"country": {
"terms": {
"field": "OriginCountry"
}
}
}
}
如上这条语义就是根据 OriginCountry 国家对航班信息进行 group by。
Filter Aggregation
Filter Aggregation,过滤聚合,其实就是添加了一个分桶的过滤匹配条件,只有符合这个条件的文档才会参与聚合统计。
- filter 为要过滤的条件,语法可以参考查询语法,使用 term、match等都可以
POST kibana_sample_data_flights/_search
{
"size": 0,
"aggs": {
"country": {
"filter": {
"term": {
"OriginCountry": "US"
}
},
"aggs": {
"ticket": {
"avg": {
"field": "AvgTicketPrice"
}
}
}
}
}
}
结果:
"aggregations" : {
"country" : {
"doc_count" : 2001,
"ticket" : {
"value" : 606.0703937315095
}
}
}
上边这个结果就是只统计国家为us的飞机航班的平均票价,filter为要过滤的条件。
Filters Aggregation
Filters Aggregation 相当于是多个 Filter Aggregation,支持多个匹配条件,但是这里的多个并不是条件叠加,而是类似buckAPi那种的多个API分别执行,然后一次返回,省去网络IO。
POST kibana_sample_data_flights/_search
{
"size": 0,
"aggs": {
"country": {
"filters": {
"filters": {
"us": {
"match": {
"OriginCountry": "US"
}
},
"cn": {
"match": {
"OriginCountry": "CN"
}
}
}
},
"aggs": {
"ticket": {
"avg": {
"field": "AvgTicketPrice"
}
}