博客
关于我
Elasticsearch 聚合
阅读量:443 次
发布时间:2019-03-06

本文共 6940 字,大约阅读时间需要 23 分钟。

目录

一、前言

聚合是一种基于搜索的数据汇总,通过组合可以完成复杂的操作。聚合可以对文档进行汇总、分组等。通过聚合,我们会得到一个数据的概览,是分析和总结全部的数据,而不是寻找单个文档。

二、分类

  • Bucket Aggregation:一些列满足特定条件的文档的集合,类似MySQL的“group by”
  • Metric Aggregation:一些数学运算,可以对文档字段进行统计分析,比如max、min、sum等。
  • Pipeline Aggregation:对其他的聚合结果进行二次聚合
  • Matrix Aggregation:支持对多个字段的操作并提供一个结果矩阵,7.x版本合并到Metric Aggregation中了。

三、聚合结构

{    "size": 0,     ["query": {}, ]?    "aggs" : {        "${my_name}" : {            "${aggregation_type}" : {                
} [,"meta" : { [
] } ]? [,"aggs" : { [
]+ } ]? } [,"${my_name}" : { ... } ]* }}
  • 聚合可以进行嵌套,比如上面的“aggs”内部又嵌套了一个“aggs”
  • “aggs”是简写,也可以写完整“aggregations”
  • 最上面的“size”一般设置为0,聚合操作用于统计数据,无需输出文档
  • query 查询,可选
  • my_name 自定义名字

四、测试数据

使用kibana导入“kibana_sample_data_flights”,这个是飞机的航班信息,有地区、价格、天气等信息。

操作路径:Home --> 添加数据 --> 样例数据 --> Sample flight data

五、Bucket Aggregation

1、子聚合

根据目的地(DestCountry)进行分组,查看航班的数量

GET kibana_sample_data_flights/_search{  "size": 0,  "aggs": {    "dest_count": {      "terms": {        "field": "DestCountry"      }    }  }}

2、数字区间分组

根据价格区间进行分组,比如0到100元多少个,100到200元多少个

GET kibana_sample_data_flights/_search{  "size": 0,  "aggs": {    "price_stat": {     // 自定义名字      "histogram": {        "field": "AvgTicketPrice",        "interval": 100     // 指定区间      }    }  }}

输出的结果中,key为“100.0”代表0到100.0的数据,计算公式如下

bucket_key = Math.floor(value / interval) * interval

3、日期区间分组

GET kibana_sample_data_flights/_search{  "size": 0,  "aggs": {    "price_stat": {      "date_histogram": {        "field": "timestamp",        "calendar_interval": "month"      }    }  }}

注意:日期间隔设置,7.x版本用“calendar_interval”,老版本用“interval”。

支持的时间间隔表达式

  • 分钟:minute, 1m
  • 小时:hour, 1h
  • 天:day, 1d
  • 星期:week, 1w
  • 月:month, 1M
  • 季度:quarter, 1q
  • 年:year, 1y

六、Metric Aggregation

计算度量这类的聚合操作是以使用一种方式或者从文档中提取需要聚合的值为基础的。这些数据不但可以从文档(使用数据属性)的属性中提取出来,也可以使用脚本生成。

支持max、min、count、sum、avg、stats(各种统计信息)、cardinality(去重后数量)、percentiles(百分位)、geo_bounds(地理边界)

1、最值

输出航班的最大价格,最小价格

GET kibana_sample_data_flights/_search{  "size": 0,  "aggs": {    "max_price": {      "max": {        "field": "AvgTicketPrice"      }    },    "mix_price": {      "min": {        "field": "AvgTicketPrice"      }    }  }}

2、嵌套操作

输出各个目的地航班的最