学习目标

掌握聚合分析的查询语法。
掌握指标聚合、桶聚合的用法

聚合分析简介

ES聚合分析是什么?

聚合分析是数据库中重要的功能特性,完成对一个查询的数据集中数据的聚合计算,如:找出某字段(或计算表达式的结果)的最大值、最小值,计算和、平均值等。ES作为搜索引擎兼数据库,同样提供了强大的聚合分析能力。

对一个数据集求最大、最小、和、平均值等指标的聚合,在ES中称为指标聚合   metric
而关系型数据库中除了有聚合函数外,还可以对查询出的数据进行分组group by,再在组上进行指标聚合。在 ES 中group by 称为分桶,桶聚合  bucketing

ES中还提供了矩阵聚合(matrix)、管道聚合(pipleline),但还在完善中。

ES聚合分析查询的写法

在查询请求体中以aggregations节点按如下语法定义聚合分析:

"aggregations" : {
    "<aggregation_name>" : {         //aggregations 也可简写为 aggs
        "<aggregation_type>" : {
            <aggregation_body>
        }
        [,"meta" : {  [<meta_data_body>] } ]?
        [,"aggregations" : { [<sub_aggregation>]+ } ]?
    }
    [,"<aggregation_name_2>" : { ... } ]*
}

聚合分析的值来源

聚合计算的值可以取字段的值,也可是脚本计算的结果。

 

指标聚合

搜索引擎(Elasticsearch聚合分析)-LMLPHP

max  min  sum  avg

POST /bank/_search?
{
  "size": 0,
  "aggs": {
    "masssbalance": {
      "max": {
        "field": "balance"
      }
    }
  }
}
查询所有客户中余额的最大值
POST /bank/_search?
{
  "size": 2,
  "query": {
    "match": {
      "age": 24
    }
  },
  "sort": [
    {
      "balance": {
        "order": "desc"
      }
    }
  ],
  "aggs": {
    "max_balance": {
      "max": {
        "field": "balance"
      }
    }
  }
}
年龄为24岁的客户中的余额最大值
POST /bank/_search?size=0
{
    "aggs" : {                   //值来源于脚本
        "avg_age" : {
            "avg" : {
                "script" : {    //查询所有客户的平均年龄是多少
                    "source" : "doc.age.value"
                }
            }
        },
        "avg_age10" : {
            "avg" : {
                "script" : {
                    "source" : "doc.age.value + 10"
                }
            }
        }
    }}
POST /bank/_search?size=0
{
  "aggs": {
    "sum_balance": {
      "sum": {
        "field": "balance",   //指定field,在脚本中用_value 取字段的值
        "script": {
            "source": "_value * 1.03"
        }
      }
    }
  }
}
POST /bank/_search?size=0
{
  "aggs": {
    "avg_age": {
      "avg": {
        "field": "age",
        "missing": 18
      }
    }  }}
POST /bank/_search?size=0
{
  "aggs": {
    "avg_age": {
      "avg": {
        "field": "age",    //为缺失值字段,指定值。如未指定,缺失该字段值的文档将被忽略。
        "missing": 18
      }
    }
  }
}

文档计数 count

POST /bank/_doc/_count
{
  "query": {
    "match": {
      "age" : 24
    }
  }
}

cardinality  值去重计数

POST /bank/_search?size=0
{
  "aggs": {
    "age_count": {
      "cardinality": {
        "field": "age"
      }
    },
    "state_count": {
      "cardinality": {
        "field": "state.keyword"
      }
    }
  }
}
state的使用它的keyword版

Value count 统计某字段有值的文档数

POST /bank/_search?size=0
{
    "aggs" : {
        "age_count" : { "value_count" : { "field" : "age" } }
    }
}
04-01 15:35