一、数据聚合
1. 概述
聚合(aggregations)可以实现对文档数据的统计、分析、运算。聚合常见有三类:
桶(Bcket)聚合:用来对文档做分组
- TermAggregation: 按照文档字段值分组
- Date Histogram: 按照日期阶梯分组,例如一周一组,或者一月为一组
度量(Metric)聚合:用以计算一些值,比如:最大值、最小值、平均值等
- Avg:求平均值
- Max:求最大值
- Min:求最小值
- Stats:同时求max、min、avg、sum 等
管道(pipeline)聚合:结果为基础做聚合
注意:参与聚合的字段必须是:keyword、数值、日期、布尔
2. Bucket聚合
2.1 DSL 实现 Bucket聚合
统计所有数据中的酒店品牌有几种,此时可以根据酒店的名称做聚合。类型为 term类型。DSL实例如下。
GET /hotel/_search
{
"size": 0, // 设置size为0,结果中不包含文档,只包含聚合结果
"aggs": { // 定义聚合
"brandAgg": { //给聚合起个名字
"terms": { // 聚合的类型,按照品牌值聚合,所以选择term
"field": "brand", // 参与聚合的字段
"size": 20 // 希望获取的聚合结果数量
}
}
}
}
2.2 Bucket聚合-聚合结果排序
默认情况下,Bucket聚合会统计Bucket内的文档数量,记为_count,并且按照_count降序排序。我们可以修改结果排序方式:
GET /hotel/_search
{
"size": 0,
"aggs": {
"brandAgg": {
"terms": {
"field": "brand",
"order": {
"_count": "asc" // 按照_count升序排列
},
"size": 20
}
}
}
}
2.3 Bucket聚合-限定聚合范围
默认情况下,Bucket聚合是对索引库的所有文档做聚合,我们可以限定要聚合的文档范围,只要添加query条件即可
GET /hotel/_search
{
"query": {
"range": {
"price": {
"lte": 200 // 只对200元以下的文档聚合
}
}
},
"size": 0,
"aggs": {
"brandAgg": {
"terms": {
"field": "brand",
"size": 20
}
}
}
}
2.4 小结
aggs代表聚合,与query同级,此时query的作用是 限定聚合的的文档范围
聚合必须的三要素: