• Elasticsearch聚合初探——metric篇


    前言

    ES中的聚合被分为两大类:Metric度量和bucket桶(原谅我英语差,找不到合适的词语.....就用单词来说吧!)。说的通俗点,metric很像SQL中的avg、max、min等方法,而bucket就有点类似group by了。

    本篇就简单的介绍一下metric聚合的用法。

    metric的聚合按照值的返回类型可以分为两种:单值聚合 和 多值聚合。

    单值聚合

    Sum 求和

    这个聚合返回的是单个值,dsl可以参考如下:

    "aggs" : {
            "intraday_return" : { "sum" : { "field" : "change" } }
        }

    返回的是change字段的和:

    {
        ...
    
        "aggregations": {
            "intraday_return": {
               "value": 2.18
            }
        }
    }

    其中intraday_return是聚合的名字,同时也会作为请求返回的id值。另外,聚合中是支持脚本的,这里就不过多赘述了,详细参考官方文档即可。

    Min 求最小值

    {
        "aggs" : {
            "min_price" : { "min" : { "field" : "price" } }
        }
    }

    Max 求最大值

    {
        "aggs" : {
            "max_price" : { "max" : { "field" : "price" } }
        }
    }

    avg 求平均值

    {
        "aggs" : {
            "avg_grade" : { "avg" : { "field" : "grade" } }
        }
    }

    cardinality 求唯一值,即不重复的字段有多少

    {
        "aggs" : {
            "author_count" : {
                "cardinality" : {
                    "field" : "author"
                }
            }
        }
    }

    多值聚合

    percentiles 求百分比

    {
        "aggs" : {
            "load_time_outlier" : {
                "percentile_ranks" : {
                    "field" : "load_time", 
                    "values" : [15, 30]
                }
            }
        }
    }

    返回的结果包含多个值:

    {
        ...
    
       "aggregations": {
          "load_time_outlier": {
             "values" : {
                "15": 92,
                "30": 100
             }
          }
       }
    }

    stats 统计

    {
        "aggs" : {
            "grades_stats" : { "stats" : { "field" : "grade" } }
        }
    }

    请求后会直接显示多种聚合结果:

    {
        ...
    
        "aggregations": {
            "grades_stats": {
                "count": 6,
                "min": 60,
                "max": 98,
                "avg": 78.5,
                "sum": 471
            }
        }
    }

    extend stats 扩展统计

    {
        "aggs" : {
            "grades_stats" : { "extended_stats" : { "field" : "grade" } }
        }
    }

    在统计的基础上还增加了多种复杂的统计信息:

    {
        ...
    
        "aggregations": {
            "grade_stats": {
               "count": 9,
               "min": 72,
               "max": 99,
               "avg": 86,
               "sum": 774,
               "sum_of_squares": 67028,
               "variance": 51.55555555555556,
               "std_deviation": 7.180219742846005,
               "std_deviation_bounds": {
                "upper": 100.36043948569201,
                "lower": 71.63956051430799
               }
            }
        }
    }

    总结

    上面并没有列举全面,比如2.0版本的ES,还支持多值的percentile Rank百分比排名,Geo Bounds地理位置信息,Scripted Metric脚本;单值的top hits等等。

    • 在性能上,ES也做了很多的优化:比如max和min,如果对于排序的字段,那么就直接跳过了计算的步骤,直接取出目标值即可。
    • 当然有些聚合也是需要特定的场合的,比如cardinality计算唯一值是通过哈希的方式,如果字段数据规模很大,那么会消耗很多的性能。
    • 另外桶之间是可以嵌套的,比如在range聚合下嵌套了一个max聚合,那么会在range得到的每个结果组上,再次进行max的统计。
    • 在聚合中支持脚本的使用,可以增加统计的灵活度。

    很多内容还需要在实践中使用,才能了解它的优势。

  • 相关阅读:
    Qt中的角度转弧度
    Qt5鼠标事件及实例
    POJ 2239 Selecting Courses【最大匹配】
    POJ 1325 Machine Schedule【最小点覆盖】
    POJ 1469 COURSES【二分图最大匹配】
    POJ 1274 The Perfect Stall【二分图最大匹配】
    poj2226Muddy Fields【最小点覆盖(建图的思路比较好)】
    hdu4160Dolls【最小路径覆盖】
    hdu2444The Accomodation of Students【判断二分图+最大匹配】
    HLG1407Leyni的游戏【最小点权覆盖集】
  • 原文地址:https://www.cnblogs.com/ExMan/p/10548329.html
Copyright © 2020-2023  润新知