Aggregations
- 聚合,提供了一种基于查询条件来对数据进行分桶、计算的方法。有点类似于 SQL 中的 group by 再加一些函数方法的操作
- 聚合可以嵌套,由此可以组成复杂的操作(Bucketing聚合可以包含sub-aggregation)
聚合可以实现对文档数据的统计 分析 运算,常见聚合有三类
- 桶bucket聚合:用来对文档做分组
- TermAggregation 按照文档字段分组
- Date Histogram 按照日期阶梯分组,比如一周为一组 或者 一月为一组
- 度量metric聚合: 用来计算一些值
- Avg 平均值
- Max 求最大值
- Avg 求最小值
- Stats 同时求 max min avg sum等
- 管道pipeline聚合: 其他聚合的结果为基础做聚合
参与聚合的字段类型必须是
- keyword
- 数值
- 日期
- 布尔
聚合提供了分组并统计数据的能力。理解聚合的最简单的方式是将其粗略地等同为SQL的GROUP BY和SQL聚合函数。在Elasticsearch中,你可以在一个响应中同时返回命中的数据和聚合结果。你可以使用简单的API同时运行查询和多个聚合,并以一次返回,这避免了来回的网络通信,这是非常强大和高效的。
桶聚合 Bucket
GET /hotel/_search
{
"query": {
"range": {
"price": {
"lte": 200 //限定聚合范围
}
}
}
"size": 0,
"aggs": {
"brandAgg": {
"terms": {
"field": "brand",
"order":{
//"_count": "asc" //默认按照文档数量倒序排序,可以设置为升序排序
}
"size": 10
}
}
}
}
得到结果为
{
aggregations:{
brandAgg: {
buckets:[
{
"key": "如家",
"doc_count": 859,
},
{
"key": "汉庭",
"doc_count": 652,
}
]
}
}
}
嵌套聚合 Metric
分别计算出每个
GET /hotel/_search
{
"query": {
"range": {
"price": {
"lte": 200 //限定聚合范围
}
}
}
"size": 0,
"aggs": {
"brandAgg": {
"terms": {
"field": "brand",
"size": 10,
"order":{
"scoreAgg.avg": "desc" //按照分值平均值倒序排序
}
},
"aggs": {
"scoreAgg": {
"stats": { // stats 同时求 max min avg sum等
"field": "score",
}
}
}
}
}
}
得到结果为
{
aggregations:{
brandAgg: {
buckets:[
{
"key": "如家",
"doc_count": 100,
"scoreAgg":{
"count": 100,
"min": 1,
"max": 5,
"avg": 4, //平均得分
"sum": 400
}
},
{
"key": "汉庭",
"doc_count": 200,
"scoreAgg":{
"count": 200,
"min": 1,
"max": 5,
"avg": 3, //平均得分
"sum": 600
}
}
]
}
}
}