@@注意:本篇笔记使用的ElasticSearch7.5
1.什么是聚合分析
聚合分析是值ElasticSearch
除搜索功能外提供的针对ElasticSearch
数据做统计分析的功能
- 功能丰富: 提供
Bucket,Metric,Pipeline
等多种分析方式,可以满足大部分的分析需求
- 实时性高: 所有的计算结果都是及时返回的,而
Hadoop
等大数据系统一般都是T+1
的。
2.聚合分类
名称 |
作用 |
对比Mysql |
分桶类型 (Bucket ) |
满足特定条件的文档的集合 |
类似GROUP BY 语法 |
指标分析类型(Metric ) |
计算最大值,最小值,平均值等 |
类似 COUNT 、 SUM() 、 MAX() 等统计方法 |
管道分析类型(Pipeline ) |
对聚合结果进行二次分析 |
|
矩阵分析类型(Matrix ) |
支持对多个字段的操作并提供一个结果矩阵 |
|
3.Bucket聚合分析
按照Bucket
的分桶策略,常见的Bucket
聚合分析如下:
策略 |
描述 |
Terms |
最简单策略,如果是text 类型,则按照分词后的结果分桶 |
Range |
按照指定数值的范围来设定分桶规则 |
Date Range |
通过指定日期的范围来设定分桶规则 |
Histogram |
直方图,以固定间隔的策略来分割数据 |
Date Histogram |
针对日期的直方图或者柱状图,是时序数据分析中常用的聚合分析类型 |
3.1 Terms
最简单策略,如果是text
类型,则按照分词后的结果分桶
1.语法
{ "size":0, "aggs": { "可自定义分组名": { "terms": { "field": "指定字段", "size": 3 } } } }
|
2.使用
curl -XGET "http://elasticsearch:9200/test_db/_search" -H 'Content-Type: application/json' -d'{ "aggs": { "my_name_group": { "terms": { "field": "name", "size": 3 } } } }'
|
3.2 Range
按照指定数值的范围来设定分桶规则
1.语法
{ "size":0, "aggs": { "可自定义分组名": { "range": { "field": "字段", "ranges": [ { "from": 10, "to": 20 }, { "from": 20, "to": 30 }, ... ] } } } }
|
2.使用
curl -XGET "http://elasticsearch:9200/test_db/_search" -H 'Content-Type: application/json' -d'{ "aggs": { "age_range": { "range": { "field": "age", "ranges": [ { "from": 10, "to": 20 }, { "from": 20, "to": 30 }, { "from": 30, "to": 40 } ] } } } }'
|
3.3 Date Range
通过指定日期的范围来设定分桶规则
1.语法
{ "size":0, "aggs": { "可自定义分组名": { "date_range": { "field": "字段", "ranges": [ { "from": "begin", "to": "end" }, { "from": "now-10d/d", "to": "now" } ] } } } }
|
2.使用
3.4 Histogram
直方图,以固定间隔的策略来分割数据
1.语法
{ "size": 0, "aggs": { "NAME": { "histogram": { "field": "字段", "interval": 10, "extended_bounds": { "min": 10, "max": 40 } } } } }
|
2.使用
curl -XGET "http://elasticsearch:9200/test_db/_search" -H 'Content-Type: application/json' -d'{ "size": 0, "aggs": { "NAME": { "histogram": { "field": "age", "interval": 10, "extended_bounds": { "min": 10, "max": 40 } } } } }'
|
3.5 Date Histogram
针对日期的直方图或者柱状图,是时序数据分析中常用的聚合分析类型
1.语法
{ "size": 0, "aggs": { "NAME": { "date_histogram": { "field": "字段", "interval": "day", "format": "yyyy-MM-dd", "extended_bounds": { "min": "最小值", "max": "最大值" } } } } }
|
interval
:值有:year、month、week、day、hour、minute
2.使用
curl -XGET "http://elasticsearch:9200/test_db/_search" -H 'Content-Type: application/json' -d'{ "size": 0, "aggs": { "NAME": { "date_histogram": { "field": "create", "interval": "day", "format": "yyyy-MM-dd", "extended_bounds": { "min": "2021-03-24", "max": "2021-03-29" } } } } }'
|
4.Metric
指标分析
计算最大值,最小值,平均值等,类似 COUNT
、 SUM()
、 MAX()
等统计方法。
4.1 单值分析
1. 最大和最小
max
:返回数值类字段的最大值
min
: 返回数值类字段的最小值
1.语法
{ "size": 0, "aggs": { "自定义分组名": { "max/min": { "field": "字段" } } } }
|
2.使用
2. 平均值、求和
avg
: 返回数值类字段的平均值
sum
: 返回数值类字段的总和
1.使用
3.去重
cardinality
: 是指不同数值的个数,类似SQL
中的distinct count
概念
1.使用
4.2 多值分析
1.Stats
返回一系列数值类型的统计值,包含min,max,avg,sum和count
,被分析的字段只能是数字类型
2.Extended Stats
对stats
的扩展,包含了更多的统计数据,如方差,标准差等
![image-20210329161022909](/Users/hui/Library/Application Support/typora-user-images/image-20210329161022909.png)
3.top_hits
一般用于分桶后获取桶内最匹配的顶部文档列表,即详情数据
curl -XGET "http://elasticsearch:9200/test_db/_search" -H 'Content-Type: application/json' -d'{ "size":0, "aggs":{ "teterms_demo":{ "terms":{ "field":"age", "size":10 }, "aggs":{ "top_hits_demo":{ "top_hits":{ "size":10, "sort":[ { "age":{ "order":"desc" } } ] } } } } } }'
|
5.聚合附加条件
5.1 filter
filter
: 为聚合分析设定过滤条件。
curl -XGET "http://elasticsearch:9200/test_db/_search" -H 'Content-Type: application/json' -d'{ "size": 0, "aggs": { "filter_demo": { "filter": { "match_phrase":{ "home":"北京" } }, "aggs": { "name_group_demo": { "terms": { "field": "name", "size": 10 } } } } } }'
|
注意这里的数据结构嵌套。
6.聚合后排序
可以使用自带的关键数据进行排序,如下:
_count
: 文档数
_key
: 按照key值排序