一、数据聚合
聚合(aggregations): 实现对文档数据的统计、分析、运算。
(一)聚合的常见种类
- 桶(Bucket)聚合: 用来做文档分组。
- TermAggregation: 按照文档字段值分组
- Date Histogram: 按照日期阶梯分组,例如一周一组,一月一组
- 度量(Metric)聚合: 用以计算一些值,比如最大值、最小值、平均值等。
- Avg: 求平均值
- Max: 求最大值
- Min: 求最小值
- Stats: 同时求max、min、avg、sum等
- 管道(pipeline)聚合: 其它聚合的结果为基础的聚合。
参与聚合的字段类型:
- keyword
- 数值
- 日期
- 布尔
(二)DSL实现聚合
1、桶聚合
当我们统计所有数据中的酒店品牌有几种,此时可以根据酒店品牌的名称做聚合。
(1)基本实现
GET /hotel/_search
{
"size": 0, // 设置size为0,结果中不包含文档,只包含聚合结果
"aggs": { // 定义聚合
"brandAgg": { // 给聚合起个名字
"terms": { // 聚合的类型,按照品牌值聚合,所以选择term
"field": "brand", //参与聚合的字段
"size": 20 // 希望获取的聚合结果数量
}
}
}
}
(2)Bucket聚合结果排序
默认情况下,Bucket聚合会统计Bucket内的文档数量,记为_count,并且按照_count降序排序。
那么如何修改排序?
GET /hotel/_search
{
"size": 0, // 设置size为0,结果中不包含文档,只包含聚合结果
"aggs": { // 定义聚合
"brandAgg": { // 给聚合起个名字
"terms": { // 聚合的类型,按照品牌值聚合,所以选择term
"field": "brand", //参与聚合的字段,
"order": { # 排序
"_count": "asc"
},
"size": 20 // 希望获取的聚合结果数量
}
}
}
}
(3)限定聚合范围
默认情况下,Bucket聚合是对索引库的所有文档做聚合,可以限定聚合的文档范围,只要添加query条件。
GET /hotel/_search
{
"query": {
"range": {
"price": {
"lte": 200 # 只对200元以下的文档聚合
}
}
}
"size": 0, // 设置size为0,结果中不包含文档,只包含聚合结果
"aggs": { // 定义聚合
"brandAgg": { // 给聚合起个名字
"terms": { // 聚合的类型,按照品牌值聚合,所以选择term
"field": "brand", //参与聚合的字段,
"order": { # 排序
"_count": "asc"
},
"size": 20 // 希望获取的聚合结果数量
}
}
}
}
2、Metrics聚合
需求: 要求获取每个品牌的用户评分的min、max、avg等值。
GET /hotel/_search
{
"size": 0,
"aggs": { // 定义聚合
"brandAgg": { // 给聚合起个名字
"terms": { // 聚合的类型,按照品牌值聚合,所以选择term
"field": "brand",
"order": { # 排序
"scoreAgg.avg": "desc"
},
"size": 20
},
"aggs": { #是brands聚合的子聚合,也就是对分组后对每组分别计算
"score_stats": { #聚合名称
“stats”: { #聚合类型,这里的stats可以同时计算min、max、avg等
"field": "score" #聚合字段,这里是score
}
}
}
}
}
}
(三)RestClient实现聚合
1、桶聚合
//1、创建request对象
SearchRequest request