简介
ElasticSearch 是基于Lucene的一个搜索引擎,在大数据业务中用处极其广泛。一般在生产中我们一般采用ES+Hbase来处理实际数据查询以应对大数量、高频率查询的场景。在一些企业制定化需求中有很多特殊的场景,需要我们去聚合数据来满足业务需求,如sum、avg、value_count、max、min等指标聚合,terms、histogram、date_histogram、range等桶聚合函数。
聚合解析
1、桶分组
ES进行聚合前需要对目标数据进行分组操作,也就是官方所谓的聚合桶,桶亦是组的意思。目前ES支持四种聚合桶算法:
1.1 terms聚合
terms聚合就如同MYSQL中的GROUP BY一般,就是对目标数据分组
1.2 histogram聚合
histogram聚合就是间距分组,比如按照数量 10、20、30每次间距10进行分组
1.3 date_histogram聚合
date_histogram聚合是用户日期格式数据间距分组,比如日期 month、day等进行分组
1.4 range分组
range分组就是按照范围进行分组,如果数量100-200,200-400分别为多个组
2、指标聚合
指标聚合就是对文档的计算方式,也就是我们常说的计算规则,比如SUM、AVG、VALUE_COUNT、MAX、MIN等计算方式。需要注意的是 Cardinality 是对分组字段去重总和。
聚合格式
{ "aggregations" : { "<aggregation_name>" : { "<aggregation_type>" : {
<aggregation_body>
}
[// 嵌套聚合查询,支持多层嵌套 ] } ]
}
[// 多个聚合查询,每个聚合查询取不同的名字 ]*
}
}
说明:
-
aggregations - 代表聚合查询语句,可以简写为aggs
-
<aggregation_name> - 代表一个聚合计算的名字,可以随意命名,因为ES支持一次进行多次统计分析查询,后面需要通过这个名字在查询结果中找到我们想要的计算结果。
-
<aggregation_type> - 聚合类型,代表我们想要怎么统计数据,主要有两大类聚合类型,桶聚合和指标聚合,这两类聚合又包括多种聚合类型,例如:指标聚合:sum、avg, 桶聚合:terms、date histogram等等。
-
<aggregation_body> - 聚合类型的参数,选择不同的聚合类型,有不同的参数。
-
aggregation_name_2 - 代表其他聚合计算的名字,意思就是可以一次进行多种类型的统计。
小试牛刀
我们通过一个综合例子对ES聚合语法进行演示
为简化演示步骤便于查看测试脚本,我们采用kibana进行演示
1、创建测试索引和测试数据
#创建索引
PUT aggs_test
#设置属性
PUT aggs_test/_mapping
{
"properties":{
"title":{
"type":"text"
},
"number":{
"type":"long"
},
"createDate":{
"type" : "date",
"format" : "date_optional_time"
}
}
}
#新增测试数据
POST aggs_test/_doc/1
{
"title":"苹果",
"number": 100,
"createDate": "2021-11-10T15:55:53+08:00"
}
POST aggs_test/_doc/2
{
"title":"梨子",
"number": 50,
"createDate": "2021-11-20T15:55:53+08:00"
}
POST aggs_test/_doc/3
{
"title":"香蕉",
"number": 150,
"createDate": "2021-11-22T15:55:53+08:00"
}
POST aggs_test/_doc/4
{
"title":"橘子",
"number": 50,
"createDate": "2021-11-25T15:55:53+08:00"
}
2、获取测试数据
GET aggs_test/_search
{
}
3、将桶聚合和指标聚合同时测试,我们可以多个聚合查询封装为一个测试查询语句
注意:复制测试语句请去除注释(//及其后面文字均为注释),包含注释语法是不正确的。
GET aggs_test/_search
{
"size":0,
"aggs": {
"terms_number": {//普通分组
"terms": {
"field": "number",
"order": {//分组和排序
"_key": "desc"
},
"size": 2//分组后条数
}
},
"his_number": {//间距分组
"histogram": {
"field": "number",
"interval": 20
}
},
"range_number": {//范围分组
"range": {
"field": "number",
"ranges": [
{
"from": 50,
"to": 100
},{
"from": 100,
"to": 150
}
]
}
},
"date_his":{//日期间隔分组
"date_histogram": {
"field": "createDate",
"interval": "day",
"time_zone":"+08:00",
"min_doc_count": 0,
"format" : "yyyy-MM-dd"
}
},
"avg_number":{//平均值
"avg": {
"field": "number"
}
},
"sum_number":{//求和
"sum": {
"field": "number"
}
},
"max_number":{//最大值
"max": {
"field": "number"
}
},
"min_number":{//最小值
"min": {
"field": "number"
}
},
"count_number":{//总条数
"value_count": {
"field": "number"
}
}
}
}
4、查看测试结果
{
"took" : 3,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 4,
"relation" : "eq"
},
"max_score" : null,
"hits" : [ ]
},
"aggregations" : {
"sum_number" : {
"value" : 350.0
},
"terms_number" : {
"doc_count_error_upper_bound" : 0,
"sum_other_doc_count" : 2,
"buckets" : [
{
"key" : 150,
"doc_count" : 1
},
{
"key" : 100,
"doc_count" : 1
}
]
},
"date_his" : {
"buckets" : [
{
"key_as_string" : "2021-11-10",
"key" : 1636473600000,
"doc_count" : 1
},
{
"key_as_string" : "2021-11-11",
"key" : 1636560000000,
"doc_count" : 0
},
{
"key_as_string" : "2021-11-12",
"key" : 1636646400000,
"doc_count" : 0
},
{
"key_as_string" : "2021-11-13",
"key" : 1636732800000,
"doc_count" : 0
},
{
"key_as_string" : "2021-11-14",
"key" : 1636819200000,
"doc_count" : 0
},
{
"key_as_string" : "2021-11-15",
"key" : 1636905600000,
"doc_count" : 0
},
{
"key_as_string" : "2021-11-16",
"key" : 1636992000000,
"doc_count" : 0
},
{
"key_as_string" : "2021-11-17",
"key" : 1637078400000,
"doc_count" : 0
},
{
"key_as_string" : "2021-11-18",
"key" : 1637164800000,
"doc_count" : 0
},
{
"key_as_string" : "2021-11-19",
"key" : 1637251200000,
"doc_count" : 0
},
{
"key_as_string" : "2021-11-20",
"key" : 1637337600000,
"doc_count" : 1
},
{
"key_as_string" : "2021-11-21",
"key" : 1637424000000,
"doc_count" : 0
},
{
"key_as_string" : "2021-11-22",
"key" : 1637510400000,
"doc_count" : 1
},
{
"key_as_string" : "2021-11-23",
"key" : 1637596800000,
"doc_count" : 0
},
{
"key_as_string" : "2021-11-24",
"key" : 1637683200000,
"doc_count" : 0
},
{
"key_as_string" : "2021-11-25",
"key" : 1637769600000,
"doc_count" : 1
}
]
},
"range_number" : {
"buckets" : [
{
"key" : "50.0-100.0",
"from" : 50.0,
"to" : 100.0,
"doc_count" : 2
},
{
"key" : "100.0-150.0",
"from" : 100.0,
"to" : 150.0,
"doc_count" : 1
}
]
},
"his_number" : {
"buckets" : [
{
"key" : 40.0,
"doc_count" : 2
},
{
"key" : 60.0,
"doc_count" : 0
},
{
"key" : 80.0,
"doc_count" : 0
},
{
"key" : 100.0,
"doc_count" : 1
},
{
"key" : 120.0,
"doc_count" : 0
},
{
"key" : 140.0,
"doc_count" : 1
}
]
},
"min_number" : {
"value" : 50.0
},
"avg_number" : {
"value" : 87.5
},
"max_number" : {
"value" : 150.0
},
"count_number" : {
"value" : 4
}
}
}
发表评论