本节 es 笔记目录如下:

  1. 分组计数
  2. 平均数 avg
  3. 最大值 max
  4. 最小值 min
  5. 总和 sum

此次笔记用到的数据还是前一节中导入的官方提供的bank数据,用到其他数据的,下面会提供导入方式。

首先,来看一下我们导入的数据的各个字段,使用下面命令获取(命令都在 kibana 中使用):

"_source" :

1、分组计数

我们对数据中state字段进行分组计数,计算数据中每个state种类出现的次数:

GET /bank/_search
{
  "size": 0,
  "aggs": {
    "group_by_state": {
      "terms": {
        "field": "state.keyword"
      }
    }
  }
}

其中,group_by_state是分组的名称,用来标识分组的名称,

terms则是用来分组的关键字,

state.keyword表示取值是state这个字段。

运行之后返回,可以看到返回结果按照state的值,作为key,以及doc_count作为count的数值结果返回。

对应于 MySQL 中的语法大致是:

SELECT

限定分组返回的数据结果:

使用到上一节笔记中的fromsize

在上面的语法中在aggssize字段,是用来限定返回结果中的源数据的条数,赋值为 0 表示不返回源数据。

而要限制分类结果的size(默认十条),则是在terms下一级,与field同级。

{

2、平均数 avg

我们想知道bank这个 index 下的所有数据中age字段的平均值,也就是所有人的平均年龄,语法如下:

GET /bank/_search
{
  "size": 0,
  "aggs": {
    "average_of_age": {
      "avg": {
        "field": "age"
      }
    }
  }
}

主体返回结果如下:

"aggregations" : {
    "average_of_age" : {
      "value" : 30.171
    }
  }

average_of_agevalue值就是我们要的 年龄平均值了。

这个语法在 MySQL 中对应如下:

SELECT

missing 值的使用:

在 es 里面,还有个missing关键字,这个字是干啥的呢?

当我们不能保证所有的数据都是完整的,尤其是涉及到查询的字段,就需要用到missing这个词。

作用是缺失值替代,也就是加了这个关键字,并且带上参数以后,在查询计算中如果查询的字段值缺失,那么就会默认使用到 missing 这个词。

bank 的数据太多了,我们可以手动创建几条数据测试:

PUT /exam/_doc/1
{
    "name" : "hunter",
    "grade": 60
}
PUT /exam/_doc/2
{
    "name" : "paul",
    "grade": 80
}
PUT /exam/_doc/3
{
    "name" : "jack",
    "grade": 90
}
PUT /exam/_doc/4
{
    "name" : "tom",
}

可以通过如下语句看一下这几条数据:

GET /exam/_search
{
  "query": {
    "match_all": {}
  }
}

可以看到,最后一条数据是没有 grade 这个字段的,

当我们直接求取平均值:

GET /exam/_search
{
  "size": 0,
  "aggs": {
    "avg_of_grade": {
      "avg": {
        "field": "grade"
      }
    }
  }
}

可以看到返回结果:

"aggregations" : {
    "avg_of_grade" : {
      "value" : 76.66666666666667
    }
  }

可以得出这个结果是只获取了有 grade 字段的三条数据,然后进行平均值计算。

当我们加上 missing 关键字:

GET /exam/_search
{
  "size": 0,
  "aggs": {
    "avg_of_grade": {
      "avg": {
        "field": "grade",
        "missing": 60
      }
    }
  }
}

返回结果如下:

可以知道虽然第四条没有 grade 的数据,但是通过 missing 指定默认值,得出了计算结果。

以上就是 missing

3、最大值 max

max 的用法和 avg 的使用方法一样,语法如下:

{

返回结果:

"aggregations" : {
    "max_age" : {
      "value" : 40.0
    }
  }

使用 script 方法计算数据:

我们还可以使用 script 的方式来得出计算结果:

GET /bank/_search
{
  "size": 0,
  "aggs":{
    "max_age": {
      "max": {
        "script": {
          "source": "doc.age.value"
        }
      }
    }
  }
}

还有一种对返回的结果进行计算的脚本方式:

GET /bank/_search
{
  "size": 0,
  "aggs":{
    "max_age": {
      "max": {
        "field": "age",
        "script": {
          "source": "_value * params.conversion_rate",
          "params": {
            "conversion_rate": 1.2
          }
        }
      }
    }
  }
}

4、最小值 min

最小值的计算方法和最大值相同,关键字 max 改成 min即可,如下是示例:

GET /bank/_search
{
  "size": 0,
  "aggs": {
    "min_age": {
      "min": {
        "field": "age"
      }
    }
  }
}

如上语法对应 MySQL 中的是:

SELECT

5、计算总和 sum

目标:计算数据中 age 的总和

{

对应于 MySQL 中的语法是:

SELECT

如果要加上筛选条件,比如 state 的值为 TX 的数据的 age 的总和:

{

对应于 MySQL 中的语法是:

SELECT SUM(age) FROM table_name WHERE age='TX';