美文网首页
Elasticsearch 指标聚合(metrics) ---

Elasticsearch 指标聚合(metrics) ---

作者: 一位先生_ | 来源:发表于2022-06-08 11:28 被阅读0次

    ES指标聚合,就是类似SQL的统计函数,指标聚合可以单独使用,也可以跟桶聚合一起使用。

    常用的统计函数如下:

    Value Count - 类似sql的count函数,统计总数
    Cardinality - 类似SQL的count(DISTINCT 字段), 统计不重复的数据总数
    Avg - 求平均值
    Sum - 求和
    Max - 求最大值
    Min - 求最小值
    下面分别介绍Elasticsearch常用统计函数的用法。

    1. Value Count
      值聚合,主要用于统计文档总数,类似SQL的count函数。

    例子:

    GET /sales/_search?size=0
    {
      "aggs": {
        "types_count": { // 聚合查询的名字,随便取个名字
          "value_count": { // 聚合类型为:value_count
            "field": "type" // 计算type这个字段值的总数
          }
        }
      }
    }
    

    等价SQL:

    select count(type) from sales
    

    返回结果:

    {
        ...
        "aggregations": {
            "types_count": { // 聚合查询的名字
                "value": 7 // 统计结果
            }
        }
    }
    

    2.Cardinality
    基数聚合,也是用于统计文档的总数,跟Value Count的区别是,基数聚合会去重,不会统计重复的值,类似SQL的count(DISTINCT 字段)用法。

    例子:

    POST /sales/_search?size=0
    {
        "aggs" : {
            "type_count" : { // 聚合查询的名字,随便取一个
                "cardinality" : { // 聚合查询类型为:cardinality
                    "field" : "type" // 根据type这个字段统计文档总数
                }
            }
        }
    }
    

    等价SQL:

    select count(DISTINCT type) from sales
    

    返回结果:

    {
        ...
        "aggregations" : {
            "type_count" : { // 聚合查询的名字
                "value" : 3 // 统计结果
            }
        }
    }
    

    提示:前面提到基数聚合的作用等价于SQL的count(DISTINCT 字段)的用法,其实不太准确,因为SQL的count统计结果是精确统计不会丢失精度,但是ES的cardinality基数聚合统计的总数是一个近似值,会有一定的误差,这么做的目的是为了性能,因为在海量的数据中精确统计总数是非常消耗性能的,但是很多业务场景不需要精确的结果,只要近似值,例如:统计网站一天的访问量,有点误差没关系。

    3.Avg
    求平均值

    例子:

    POST /exams/_search?size=0
    {
      "aggs": {
        "avg_grade": { // 聚合查询名字,随便取一个名字
          "avg": { // 聚合查询类型为: avg
            "field": "grade" // 统计grade字段值的平均值
          }
        }
      }
    }
    

    返回结果:

    {
        ...
        "aggregations": {
            "avg_grade": { // 聚合查询名字
                "value": 75.0 // 统计结果
            }
        }
    }
    

    4.Sum
    求和计算

    例子:

    POST /sales/_search?size=0
    {
      "aggs": {
        "hat_prices": { // 聚合查询名字,随便取一个名字
          "sum": { // 聚合类型为:sum
            "field": "price" // 计算price字段值的总和
          }
        }
      }
    }
    

    返回结果:

    {
        ...
        "aggregations": {
            "hat_prices": { // 聚合查询名字
               "value": 450.0 // 统计结果
            }
        }
    }
    

    5.Max
    求最大值

    例子:

    POST /sales/_search?size=0
    {
      "aggs": {
        "max_price": { // 聚合查询名字,随便取一个名字
          "max": { // 聚合类型为:max
            "field": "price" // 求price字段的最大值
          }
        }
      }
    }
    

    返回结果:

    {
        ...
        "aggregations": {
            "max_price": { // 聚合查询名字
                "value": 200.0 // 最大值
            }
        }
    }
    

    6.Min
    求最小值

    例子:

    POST /sales/_search?size=0
    {
      "aggs": {
        "min_price": { // 聚合查询名字,随便取一个
          "min": { // 聚合类型为: min
            "field": "price" // 求price字段值的最小值
          }
        }
      }
    }
    

    返回:

    {
        ...
    
        "aggregations": {
            "min_price": { // 聚合查询名字
                "value": 10.0 // 最小值
            }
        }
    }
    

    7.综合例子
    前面的例子,仅仅介绍聚合指标单独使用的情况,实际应用中经常先通过query查询,搜索索引中的数据,然后对query查询的结果进行统计分析。

    例子:

    GET /sales/_search
    {
      "size": 0, // size = 0,代表不想返回query查询结果,只要统计结果
      "query": { // 设置query查询条件,后面的aggs统计,仅对query查询结果进行统计
        "constant_score": {
          "filter": {
            "match": {
              "type": "hat"
            }
          }
        }
      },
      "aggs": { // 统计query查询结果, 默认情况如果不写query语句,则代表统计所有数据
        "hat_prices": { // 聚合查询名字,计算price总和
          "sum": {
            "field": "price"
          }
        },
        "min_price": { // 聚合查询名字,计算price最小值
          "min": { 
            "field": "price" 
          }
        },
        "max_price": { // 聚合查询名字,计算price最大值
          "max": { 
            "field": "price"
          }
        }
      }
    }
    

    返回:

    {
        ...
        "aggregations": {
            "hat_prices": { // 求和
               "value": 450.0
            },
            "min_price": { // 最小值
                "value": 10.0 
            },
            "max_price": { // 最大值
                "value": 200.0 
            }
        }
    }
    

    相关文章

      网友评论

          本文标题:Elasticsearch 指标聚合(metrics) ---

          本文链接:https://www.haomeiwen.com/subject/zpnfsrtx.html