在上一篇文章中,我们介绍了《大数据搜索与可视化分析(9)elasticsearch聚合分析-Metric Aggregation》,本文继续学习elasticsearch聚合分析-Bucket Aggregation。
Bucket Aggregation
图片参考文章《Elasticsearch 之聚合分析入门https://www.cnblogs.com/wupeixuan/p/12549336.html》
Bucket 就是桶的意思,即按照一定的规则将文档分配到不同的桶中,达到分类分析的目的。如上图所示,左边有一堆文档,右边有三个桶,每个桶有不同的规则,比如第一个桶的规则为价格小于 3000 的,第二个桶为价格大于等于 3000 小于 6000 的,最后一个桶的规则为价格大于 6000 的,然后不同的文档根据不同的价格分到不同的桶中,那么我们就实现了分类。
有了 Bucket 聚合分析机制,我们就可以把公司员工以年龄方式进行区分,以地理位置的方式来区分客户,以男性女性来区分演员等。
根据 Bucket 的分桶策略,常见的 Bucket 聚合分析如下:
Terms:直接按照 term 来分桶,如果是 text 类型,则按照分词后的结果分桶
Range:指定数值的范围来设定分桶规则
Date Range:指定日期的范围来设定分桶规则
Histogram:直方图,以固定间隔的策略来分割数据
Date Histogram:针对日期的直方图或者柱状图,是时序数据分析中常用的聚合分析类型
首先插入样例数据
POST test_aggregation/_bulk{"index":{"_id":"1"}}{"username":"曹操","job":"主公","age":50,"birth":"1900-01-01","isMarried":true,"salary":100}{"index":{"_id":"2"}}{"username":"曹丕","job":"主公","age":28,"birth":"1980-05-07","isMarried":true,"salary":30}{"index":{"_id":"3"}}{"username":"曹睿","job":"主公","age":20,"birth":"1990-05-07","isMarried":true,"salary":20}{"index":{"_id":"4"}}{"username":"荀彧","job":"军师","age":22,"birth":"1985-08-07","isMarried":false,"salary":15}{"index":{"_id":"5"}}{"username":"司马懿","job":"军师","age":23,"birth":"1989-08-07","isMarried":false,"salary":8}{"index":{"_id":"6"}}{"username":"程昱","job":"军师","age":20,"birth":"1990-08-07","isMarried":false,"salary":5}{"index":{"_id":"7"}}{"username":"典韦","job":"武士","age":18,"birth":"1994-08-07","isMarried":false,"salary":5}{"index":{"_id":"8"}}{"username":"许褚","job":"武士","age":26,"birth":"1987-08-07","isMarried":false,"salary":12}
Terms:直接按照 term 来分桶并统计
GET test_aggregation/_search{ "aggs": { "NAME": { "terms": { "field": "job.keyword", "size": 10 } } }}
统计结果:
"aggregations" : { "NAME" : { "doc_count_error_upper_bound" : 0, "sum_other_doc_count" : 0, "buckets" : [ { "key" : "主公", "doc_count" : 3 }, { "key" : "军师", "doc_count" : 3 }, { "key" : "武士", "doc_count" : 2 } ] } }
从结果中可以看到文档根据job分成了不同的桶,每个桶还包括 doc_count,这样就可以很轻松知道 ES 存储的三国信息中,主公,军师,武士分别有多少条。
Range:指定数值的范围来设定分桶规则
根据工资来统计一下小于10的,10-50的,50-90的和大于90的分组
GET test_aggregation/_search{ "aggs": { "salary_range": { "range": { "field": "salary", "ranges": [ { "to": 10 }, { "from": 10, "to": 50 }, { "from": 50, "to":90 }, { "from": 90 } ] } } }}
输出结果:
"aggregations" : { "salary_range" : { "buckets" : [ { "key" : "*-10.0", "to" : 10.0, "doc_count" : 3 }, { "key" : "10.0-50.0", "from" : 10.0, "to" : 50.0, "doc_count" : 4 }, { "key" : "50.0-90.0", "from" : 50.0, "to" : 90.0, "doc_count" : 0 }, { "key" : "90.0-*", "from" : 90.0, "doc_count" : 1 } ] } }
根据输出结果可以看到,工资小于10的有三条,10-50的有4条,50-90的没有,大于90的一条。
Date Range:指定日期的范围来设定分桶规则
根据出生年份进行统计,1900年到1980年,1980年到1990年,1990年到2000年。
GET test_aggregation/_search{ "size": 0, "aggs": { "date_range": { "range": { "field": "birth", "format": "yyyy", "ranges": [ { "from": "1900", "to": "1980" }, { "from": "1980", "to": "1990" }, { "from": "1990", "to":"2000" } ] } } }}
输出结果:
"aggregations" : { "date_range" : { "buckets" : [ { "key" : "1900-1980", "from" : -2.2089888E12, "from_as_string" : "1900", "to" : 3.155328E11, "to_as_string" : "1980", "doc_count" : 1 }, { "key" : "1980-1990", "from" : 3.155328E11, "from_as_string" : "1980", "to" : 6.31152E11, "to_as_string" : "1990", "doc_count" : 4 }, { "key" : "1990-2000", "from" : 6.31152E11, "from_as_string" : "1990", "to" : 9.466848E11, "to_as_string" : "2000", "doc_count" : 3 } ] } }
Histogram:直方图,以固定间隔的策略来分割数据
按照salary进行聚合分析,直方图间隔为20,最小数据值为0,最大数据值为20.
GET test_aggregation/_search{ "aggs": { "salary": { "histogram": { "field": "salary", "interval": 20, "extended_bounds": { "min": 0, "max": 120 } } } }}
输出结果:
"aggregations" : { "salary" : { "buckets" : [ { "key" : 0.0, "doc_count" : 5 }, { "key" : 20.0, "doc_count" : 2 }, { "key" : 40.0, "doc_count" : 0 }, { "key" : 60.0, "doc_count" : 0 }, { "key" : 80.0, "doc_count" : 0 }, { "key" : 100.0, "doc_count" : 1 }, { "key" : 120.0, "doc_count" : 0 } ] } }
Date Histogram:针对日期的直方图或者柱状图,是时序数据分析中常用的聚合分析类型
GET test_aggregation/_search{ "size": 0, "aggs": { "year_historgram": { "date_histogram": { "field": "birth", "interval": "year", "format": "yyyy" } } }}
由于输出结果过长,本文就不贴结果了,由读者自行验证。
更多大数据搜索与可视化分析讲解,可点击原文查看。