博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
(转)Elasticsearch聚合初探——metric篇
阅读量:4330 次
发布时间:2019-06-06

本文共 2255 字,大约阅读时间需要 7 分钟。

前言

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的统计。
  • 在聚合中支持脚本的使用,可以增加统计的灵活度。

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

转载于:https://www.cnblogs.com/zhangmingcheng/p/7602162.html

你可能感兴趣的文章
立体图
查看>>
平面最近点对
查看>>
送分大赛
查看>>
旅行家的预算
查看>>
陈大哥的NOIP模拟
查看>>
理想正方形
查看>>
在农场万圣节
查看>>
多米诺骨牌
查看>>
骑马修栅栏
查看>>
创意吃鱼法
查看>>
无序字母对
查看>>
开车旅行
查看>>
迷途之家2019联赛
查看>>
树的重量
查看>>
579Div3
查看>>
CF583Div1+Div2
查看>>
Elaxia的路线
查看>>
保安站岗
查看>>
某CF的D
查看>>
消防局的设立
查看>>