学习目标
掌握聚合分析的查询语法。
掌握指标聚合、桶聚合的用法
聚合分析简介
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>" : { ... } ]*
}
聚合分析的值来源
聚合计算的值可以取字段的值,也可是脚本计算的结果。
指标聚合
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" } }
}
}