1.聚合的分类
聚合可以实现对文档数据的统计、分析、运算。聚合常见的分类:
• 桶(Bucket)聚合:用来对文档进行分组,比如
TermAggregation:按照文档字段值分组;
Date HIstogram:按照日期阶梯分组,例如一周为一组,或者一月为一组;
• 度量(Metric)聚合:用以计算一些值,比如:最大值、最小值、平均值等
Avg:求平均值;
Max:求最大值;
Min:求最小值;
Stats:同时求max、min、avg、sum等
• 管道(pipeline)聚合:其它聚合的结果为基础做聚合,例如按照酒店名称进行分组(桶聚合)完成之后,计算每一组酒店价格的平均值(度量聚合)
ES官方提供了几十种聚合方式,官方地址为ES官方地址。
我们需要注意的是,参与聚合的字段不能够是分词的字段,那样是没有意义的,参与聚合的字段类型可以是keyword、数值、日期、布尔类型。
2. DSL实现的 Bucket聚合
案例,假如现在要统计所有数据中的酒店品牌有几种,此时可以按照酒店品牌进行聚合。
语法如下:
GET /hotel/_search
{
"size":0,## 设置size为0,结果中不包含文档,只包含聚合结果
"aggs":{ ## 定义聚合
"brandAgg":{ ## 给聚合起个名字
"terms":{ ## 聚合的类型,例如按照品牌值聚合,所以选择term
"field":"brand",## 参与聚合的字段
"size":20 ## 希望获取的聚合结果数量,假如是200种,但是我只需要显示10种,就需要指定
}
}
}
}
默认情况下,buckt聚合会统计bucket内的文档数量,记为_count,并且按照_count降序排序,我们可以修改结果排序方式,语法如下:
GET /hotel/_search
{
"size":0,
"aggs":{
"brandAgg":{
"terms":{
"field":"brand",
“order”:{
"_count": "asc" ## 指定排序方式,按照_count升序排序
}
"size":20
}
}
}
}
上面的这种聚合方式是对整个索引库文档做聚合,对内存消耗非常大,我们可以限定要聚合的文档范围,只要添加query查询条件即可,语法如下:
GET /hotel/_search
{
"query":{ ## 指定查询条件
"range" : {
"price":{
"lte":200 //只对200元以下的文档聚合
}
}
},
"size":0,
"aggs":{
"brandAgg":{
"terms":{
"field":"brand",
“order”:{
"_count": "asc" ## 指定排序方式,按照_count升序排序
}
"size":20
}
}
}
}
3. DSL 实现Metrics聚合
例如,我们要求获取每个品牌的用户评分的min,max,avg等值。由于是对每个品牌的评分做聚合,需要先将品牌分组,将分组之后的结果进行计算,语法余下:
{
"size":0,
"aggs":{
"brandAgg":{
"terms":{
"field":"brand",
"size":20
},
"aggs"{ ## 是brands聚合的子聚合,也就是分组后对每组分别计算
score_stats":{ ## 聚合名称
"stats":{ ## 聚合类型,这里stats可以计算min、max、avg等
"field":"score" ##聚合字段,这里是score
}
}
}
}
}
}