ElasticSearch 聚合查询语法解析

简介
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" : {
    
     [<sub_aggregation>] } ]// 嵌套聚合查询,支持多层嵌套
    }
    [,"<aggregation_name_2>" : {
    
     ... } ]* // 多个聚合查询,每个聚合查询取不同的名字
  }
}

说明:
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、将桶聚合和指标聚合同时测试,我们可以多个聚合查询封装为一个测试查询语句
注意:复制测试语句请去除注释(//及其后面文字均为注释),包含注释语法是不正确的。

#aggs查询数据
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
    }
  }
}

猜你喜欢

转载自blog.csdn.net/weixin_39970883/article/details/128904057
今日推荐