前言

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

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

转自:http://www.cnblogs.com/xing901022/p/4944043.html

(转)Elasticsearch聚合初探——metric篇的更多相关文章

  1. Elasticsearch聚合初探——metric篇

    Elasticsearch是一款提供检索以及相关度排序的开源框架,同时,也支持对存储的文档进行复杂的统计--聚合. 前言 ES中的聚合被分为两大类:Metric度量和bucket桶(原谅我英语差,找不 ...

  2. Elasticsearch(8) --- 聚合查询(Metric聚合)

    Elasticsearch(8) --- 聚合查询(Metric聚合) 在Mysql中,我们可以获取一组数据的 最大值(Max).最小值(Min).同样我们能够对这组数据进行 分组(Group).那么 ...

  3. ElasticSearch入门 第八篇:存储

    这是ElasticSearch 2.4 版本系列的第八篇: ElasticSearch入门 第一篇:Windows下安装ElasticSearch ElasticSearch入门 第二篇:集群配置 E ...

  4. ElasticSearch入门 第三篇:索引

    这是ElasticSearch 2.4 版本系列的第三篇: ElasticSearch入门 第一篇:Windows下安装ElasticSearch ElasticSearch入门 第二篇:集群配置 E ...

  5. Elasticsearch学习记录(入门篇)

    Elasticsearch学习记录(入门篇) 1. Elasticsearch的请求与结果 请求结构 curl -X<VERB> '<PROTOCOL>://<HOST& ...

  6. ElasticSearch查询 第五篇:布尔查询

    布尔查询是最常用的组合查询,不仅将多个查询条件组合在一起,并且将查询的结果和结果的评分组合在一起.当查询条件是多个表达式的组合时,布尔查询非常有用,实际上,布尔查询把多个子查询组合(combine)成 ...

  7. ElasticSearch聚合(转)

    ES之五:ElasticSearch聚合 前言 说完了ES的索引与检索,接着再介绍一个ES高级功能API – 聚合(Aggregations),聚合功能为ES注入了统计分析的血统,使用户在面对大数据提 ...

  8. ElasticSearch查询 第四篇:匹配查询(Match)

    <ElasticSearch查询>目录导航: ElasticSearch查询 第一篇:搜索API ElasticSearch查询 第二篇:文档更新 ElasticSearch查询 第三篇: ...

  9. [java初探总结篇]__java初探总结

    前言 终于,java初探系列的学习,要告一阶段了,java初探系列在我的计划中是从头学java中的第一个阶段,知识主要涉及java的基础知识,所以在笔记上实在花了不少的功夫.虽然是在第一阶段上面花费了 ...

随机推荐

  1. jquery on=>keyup无法绑定未来js添加的元素

    $("[name=red_count]").on("keyup", countKeyUpBind);即使使用on的,也无法绑定未来元素, 所以直接在动态添加的时 ...

  2. Qt编写的RTSP播放器+视频监控(android版本)

    之前写过vlc版本,ffmpeg版本,也在linux上和嵌入式linux上跑过视频监控,这次想直接用ffmpeg的库写个android版本,qt+ffmpeg+android直接用之前的qt+ffmp ...

  3. es6 - class的学习

    http://es6.ruanyifeng.com/#docs/class:class Person { constructor{ //构造函数,里边放不被继承的私有属性和方法 this.proper ...

  4. Elasticsearch学习之深入搜索五 --- phrase matching搜索技术

    1. 近似匹配 什么是近似匹配,两个句子 java is my favourite programming language, and I also think spark is a very goo ...

  5. [原]openstack-kilo--issue(二) openstack auth error

    /** 系统环境:redhat7.2 repo:163 openstack version : kilo author: lihaibo 本博客已经添加"打赏"功能,"打 ...

  6. CLR 关于强命名程序集 .

    如何创建强命名程序集(Strong Name Assembly)     创建一个强命名程序集首先需要获得一个用强命名实用工具   (Strong Name Utility,即SN.exe,.NET  ...

  7. jfinal如何获取参数为数组的值

    前台: var postParams = { ids:["qw","ew"]}; 后台: String[] userids = this.getParaValu ...

  8. iOS - 开源框架、项目和学习资料汇总(UI篇)

    上下拉刷新控件 1. MJRefresh --仅需一行代码就可以为UITableView或者CollectionView加上下拉刷新或者上拉刷新功能.可以自定义上下拉刷新的文字说明.(推荐)2. SV ...

  9. MUI---IOS切换到后台继续播放音乐

    应用切换到后台继续音乐播放HBuilder默认生成的应用在iOS是不支持后台音乐播放的,当应用切换到后台时音乐将暂停播放,下次切换到前台继续播放.如果要支持应用切换到后台后继续播放音乐功能需要进行额外 ...

  10. centos6.9环境下JDK安装

    1.准备jdk安装文件: 这里我使用的是 jdk-7u79-linux-x64.tar.gz 2.在 /usr/local 目录下创建 sotfware目录,并上传JDK文件: 解压文件并修改文件夹为 ...