ES-查询-聚合篇
聚合函数用于在查询和过滤后的数据集上,进行按类聚合以获取总体统计数据。聚合函数根据其作用方式和原理,被分为以下四个类型
- Bucketing: 将文档根据设置好的判定条件,划分到不同的 Bucket 中去。(类似 SQL 的 GroupBy)
- Metric: 计算一组文档的数据,如 max,min,avg 等。当直接使用时会对所有文档计算,通常作为在 Bucketing 函数的子函数出现,计算每个 Bucket 的相关 Metric 数据。
- Matrix: 顾名思义,该类聚合函数在多个字段上生效,用于生成矩阵。不支持 Scripting(自定义脚本)。
- Pipeline: 用于聚合其他聚合函数的结果。
Notes: 聚合函数嵌套,可以将聚合函数不断嵌套,每个子函数都会在父聚合的结果和输出上继续执行。通常就是 Bucketing 聚合+Metrics 子聚合用于对于不同 Buckets 进行数据总结,再使用 Pipeline 聚合对 Buckets 进行筛选过滤排序展示。
聚合函数的 Json结构
1 | "aggregations" : { |
aggregations
可以使用aggs
简化代替。
<aggregation_name>
只是聚合函数名称,使用具有意义的名字表示聚合函数的功能。
<aggregation_type>
是聚合函数的具体类型,如Buckets 聚合中常见的 terms(按名称聚合)。
Demo case for introduction
Summary
本小节通过一个例子展示,聚合函数中三大类是如何组合使用,来实现一个具体的功能。
聚合函数组合的通常顺序如下:
Bucketing聚合将原始数据装了 Buckets 中,Metrics聚合对各个 Buckets 中数据进行统计,最后使用 Pipeline聚合,对所有的 Buckets进行筛选和排序。
我们最终的目标是实现以下的这条 SQL
1 | SELECT model,SUM(price) AS total_price FROM cars GROUP BY model HAVING total_price > 100000 ORDER BY total_price DESC LIMIT 2; |
动态 Mapping 导入原始数据
1 | POST _bulk |
查看动态 Mapping
1 | GET cars/_mappings |
Buckets Terms 聚合
使用size:0 过滤掉所有命中的 Docs,来简化返回。
第一步,我们希望数据按照名字聚合,因此选择 name.keyword 对其使用 terms 进行聚合。
1 | POST cars/_search |
Metrics Sum 计算总价
1 | POST cars/_search |
Pipeline Bucket_selector 过滤
1 | POST cars/_search |
Pipeline Bucket_sort 基于Bucket 排序
1 | POST cars/_search |
Final Result
1 | { |
Buckets
Aggregation | Elasticsearch | MySQL |
---|---|---|
Childen——父子文档 | Yes | / |
Date Histogram——基于时间(按年/月/日等等)分桶 | Yes | Complex |
Date Range | Yes | Complex |
Filter | Yes | n/a (yes) |
Filters | Yes | n/a (yes) |
Geo Distance | Yes | / |
GeoHash grid | Yes | / |
Global | Yes | n/a (yes) |
Histogram | Yes | Complex |
IPv4 Range | Yes | Complex |
Missing | Yes | Yes |
Nested | Yes | / |
Range | Yes | Complex |
Reverse Nested | Yes | / |
Sampler | Yes | Complex |
Significant Terms | Yes | No |
Terms——为字段中每个 Unique 的值建桶, text 类型则是为每个分词建桶,keyword 类型是为整个字段建桶 |
Yes | Yes |
Metrics
Aggregation | Elasticsearch | MySQL |
---|---|---|
Avg | Yes | Yes |
Cardinality——去重唯一值 | Yes (Sample based) | Yes (Exact)——类似:distinct |
Extended Stats | Yes | StdDev bounds missing |
Geo Bounds | Yes | / |
Geo Centroid | Yes | / |
Max | Yes | Yes |
Min | Yes | Yes |
Percentiles | Yes | Complex SQL or UDF |
Percentile Ranks | Yes | Complex SQL or UDF |
Scripted | Yes | No |
Stats | Yes | Yes |
Top Hits——为 Buckets中的文档进行排序和指定显示数量 | Yes | Complex |
Value Count | Yes | Yes |
Sum | Yes | Yes |
Pipeline
Matrix
略,自行官方文档获取