Elasticsearch聚合初探——metric篇

Elasticsearch是一款提供检索以及相关度排序的开源框架,同时,也支持对存储的文档进行复杂的统计——聚合。

前言

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

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

本文转自博客园xingoo的博客,原文链接:Elasticsearch聚合初探——metric篇,如需转载请自行联系原博主。

时间: 2024-09-24 18:36:00

Elasticsearch聚合初探——metric篇的相关文章

elasticsearch 聚合问题

问题描述 elasticsearch 聚合问题 { "size": 0, "aggs": { "group_by_message": { "phrases": { "field": "message" } } } } ,上面的聚合语句是对message的,但是message是一句话,比如说"127.0.0.1 - - [11/Aug/2014:15:00:41 +0800] &

Elasticsearch聚合 之 Terms

之前总结过metric聚合的内容,本篇来说一下bucket聚合的知识.Bucket可以理解为一个桶,他会遍历文档中的内容,凡是符合要求的就放入按照要求创建的桶中. 本篇着重讲解的terms聚合,它是按照某个字段中的值来分类: 比如性别有男.女,就会创建两个桶,分别存放男女的信息.默认会搜集doc_count的信息,即记录有多少男生,有多少女生,然后返回给客户端,这样就完成了一个terms得统计. Terms聚合 { "aggs" : { "genders" : {

深入浅出 spring-data-elasticsearch 之 ElasticSearch 架构初探(一)

本文目录一.Elasticsearch 基本术语1.1 文档(Document).索引(Index).类型(Type)文档三要素1.2 集群(Cluster).节点(Node).分片(Shard)分布式三要素二.Elasticsearch 工作原理2.1 文档存储的路由2.2 如何健康检查2.3 如何水平扩容三.小结 推荐:Spring For All 社区 http://spring4all.com 一.Elasticsearch 基本术语 1.1 文档(Document).索引(Index)

Elasticsearch聚合 之 DateRange日期范围聚合

相比于range聚合,date range就是范围可以由时间来指定. 例如: { "aggs":{ "range":{ "date_range":{ "field":"date", "format":"MM-yyy", "ranges":[ {"to":"now-10M/M"}, {"from&qu

Elasticsearch聚合 之 Histogram 直方图聚合

Elasticsearch支持最直方图聚合,它在数字字段自动创建桶,并会扫描全部文档,把文档放入相应的桶中.这个数字字段既可以是文档中的某个字段,也可以通过脚本创建得出的. 桶的筛选规则 举个例子,有一个price字段,这个字段描述了商品的价格,现在想每隔5就创建一个桶,统计每隔区间都有多少个文档(商品). 如果有一个商品的价格为32,那么它会被放入30的桶中,计算的公式如下: rem = value % interval if (rem < 0) { rem += interval } buc

MongoDB初探第二篇

与sql语句的简单对比 在第一篇中分享了一些MongoDB的基本知识点,因为安装运行其实都还是很轻巧的,所以对于大家上手来说应该问题不大,但是安装完成,数据库也可以连接了,但是MongoDB中是没有办法运行sql语句的.这个时候关系型数据库中的一些思维直接移植过来就不适用了,但是大道至简,其实道理还是相同的,对于的数据的操作可以通过api来完成,这个从某种程度上来说,是MongoDB的亮点也是另外一种优势. 我简单的总结了一下常用的sql语句的一些用法在MongoDB中改怎么使用. 首先一个很大

mongoDB初探第一篇

早就久仰mongoDB大名,一直没有决心开始学习,从昨天开始尝试了一把,发现真是轻巧,熟悉了oracle之后,去看mysql,发现mysql真是够轻量级的,结果再看mongoDB,更加感觉轻量级. 一般数据库的安装都是复杂,繁琐,都是需要一些配置的,有些还要一些第三方软件依赖等等. 学习mongoDB感觉真是太轻巧了.感觉就是一个解压这么简单. 虽然简单但是过程总是艰辛的,也碰到一些大大小小的问题,有些问题让人丈二和尚抓不着头脑,庆幸的是在今天都解决了大部分,在此分享. 安装mongoDB,可以

时序列数据库武斗大会之TSDB名录 Part 2

[编者按]刘斌,OneAPM后端研发工程师,拥有10多年编程经验,参与过大型金融.通信以及Android手机操作系的开发,熟悉Linux及后台开发技术.曾参与翻译过<第一本Docker书>.<GitHub入门与实践>.<Web应用安全权威指南>.<WEB+DB PRESS>.<Software Design>等书籍,也是Docker入门与实践课程主讲人.本文所阐述的「时间序列数据库」,系笔者所负责产品 Cloud Insight 对性能指标进行聚

深入浅出 spring-data-elasticsearch - 实战案例详解(四)

『  热烈的爱情到订婚早已是定点,婚一结一切了结.现在订了婚,彼此间还留着情感发展的余地,这是桩好事.- <我们仨> 』 「系列文章」 深入浅出 spring-data-elasticsearch - ElasticSearch 架构初探(一) 深入浅出 spring-data-elasticsearch - 概述(二) 深入浅出 spring-data-elasticsearch - 基本案例详解(三) 深入浅出 spring-data-elasticsearch - 实战案例详解(四) 深