我的编程空间,编程开发者的网络收藏夹
学习永远不晚

es详解-聚合-聚合查询之bucket聚合详解

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

es详解-聚合-聚合查询之bucket聚合详解

除了查询之外,最常用的聚合了,ElasticSearch提供了三种聚合方式: 桶聚合(Bucket Aggregation)指标聚合(Metric Aggregation)管道聚合(Pipline Aggregation)。本文主要讲讲桶聚合(Bucket Aggregation)

聚合的引入

我们在SQL结果中常有:

SELECT COUNT(color) 
FROM table
GROUP BY color 

ElasticSearch中在概念上类似于 SQL 的分组(GROUP BY),而指标则类似于 COUNT()SUM()MAX() 等统计方法。

进而引入了两个概念:

  • 桶(Buckets) 满足特定条件的文档的集合
  • 指标(Metrics) 对桶内的文档进行统计计算

所以ElasticSearch包含3种聚合(Aggregation)方式

  • 桶聚合(Bucket Aggregation) - 本文中详解
  • 指标聚合(Metric Aggregation) - 下文中讲解
  • 管道聚合(Pipline Aggregation) - 再下一篇讲解
    • 聚合管道化,简单而言就是上一个聚合的结果成为下个聚合的输入;

(PS:指标聚合和桶聚合很多情况下是组合在一起使用的,其实你也可以看到,桶聚合本质上是一种特殊的指标聚合,它的聚合指标就是数据的条数count)

如何理解Bucket聚合

如果你直接去看文档,大概有几十种:

要么你需要花大量时间学习,要么你已经迷失或者即将迷失在知识点中...

所以你需要稍微站在设计者的角度思考下,不难发现设计上大概分为三类(当然有些是第二和第三类的融合)

(图中并没有全部列出内容,因为图要表达的意图我觉得还是比较清楚的,这就够了;有了这种思虑和认知,会大大提升你的认知效率。)

按知识点学习聚合

我们先按照官方权威指南中的一个例子,学习Aggregation中的知识点。

准备数据

让我们先看一个例子。我们将会创建一些对汽车经销商有用的聚合,数据是关于汽车交易的信息:车型、制造商、售价、何时被出售等。

首先我们批量索引一些数据:

POST /test-agg-cars/_bulk
{ "index": {}}
{ "price" : 10000, "color" : "red", "make" : "honda", "sold" : "2014-10-28" }
{ "index": {}}
{ "price" : 20000, "color" : "red", "make" : "honda", "sold" : "2014-11-05" }
{ "index": {}}
{ "price" : 30000, "color" : "green", "make" : "ford", "sold" : "2014-05-18" }
{ "index": {}}
{ "price" : 15000, "color" : "blue", "make" : "toyota", "sold" : "2014-07-02" }
{ "index": {}}
{ "price" : 12000, "color" : "green", "make" : "toyota", "sold" : "2014-08-19" }
{ "index": {}}
{ "price" : 20000, "color" : "red", "make" : "honda", "sold" : "2014-11-05" }
{ "index": {}}
{ "price" : 80000, "color" : "red", "make" : "bmw", "sold" : "2014-01-01" }
{ "index": {}}
{ "price" : 25000, "color" : "blue", "make" : "ford", "sold" : "2014-02-12" }

标准的聚合

有了数据,开始构建我们的第一个聚合。汽车经销商可能会想知道哪个颜色的汽车销量最好,用聚合可以轻易得到结果,用 terms 桶操作:

GET /test-agg-cars/_search
{
    "size" : 0,
    "aggs" : { 
        "popular_colors" : { 
            "terms" : { 
              "field" : "color.keyword"
            }
        }
    }
}
  1. 聚合操作被置于顶层参数 aggs 之下(如果你愿意,完整形式 aggregations 同样有效)。
  2. 然后,可以为聚合指定一个我们想要名称,本例中是: popular_colors 。
  3. 最后,定义单个桶的类型 terms 。

结果如下:

  1. 因为我们设置了 size 参数,所以不会有 hits 搜索结果返回。
  2. popular_colors 聚合是作为 aggregations 字段的一部分被返回的。
  3. 每个桶的 key 都与 color 字段里找到的唯一词对应。它总会包含 doc_count 字段,告诉我们包含该词项的文档数量。
  4. 每个桶的数量代表该颜色的文档数量。

多个聚合

同时计算两种桶的结果:对color和对make。

GET /test-agg-cars/_search
{
    "size" : 0,
    "aggs" : { 
        "popular_colors" : { 
            "terms" : { 
              "field" : "color.keyword"
            }
        },
        "make_by" : { 
            "terms" : { 
              "field" : "make.keyword"
            }
        }
    }
}

结果如下:

聚合的嵌套

这个新的聚合层让我们可以将 avg 度量嵌套置于 terms 桶内。实际上,这就为每个颜色生成了平均价格。

GET /test-agg-cars/_search
{
   "size" : 0,
   "aggs": {
      "colors": {
         "terms": {
            "field": "color.keyword"
         },
         "aggs": { 
            "avg_price": { 
               "avg": {
                  "field": "price" 
               }
            }
         }
      }
   }
}

结果如下:

正如 颜色 的例子,我们需要给度量起一个名字( avg_price )这样可以稍后根据名字获取它的值。最后,我们指定度量本身( avg )以及我们想要计算平均值的字段( price )

动态脚本的聚合

这个例子告诉你,ElasticSearch还支持一些基于脚本(生成运行时的字段)的复杂的动态聚合。

GET /test-agg-cars/_search
{
  "runtime_mappings": {
    "make.length": {
      "type": "long",
      "script": "emit(doc['make.keyword'].value.length())"
    }
  },
  "size" : 0,
  "aggs": {
    "make_length": {
      "histogram": {
        "interval": 1,
        "field": "make.length"
      }
    }
  }
}

结果如下:

histogram可以参考后文内容。

按分类学习Bucket聚合

我们在具体学习时,也无需学习每一个点,基于上面图的认知,我们只需用20%的时间学习最为常用的80%功能即可,其它查查文档而已。

前置条件的过滤:filter

在当前文档集上下文中定义与指定过滤器(Filter)匹配的所有文档的单个存储桶。通常,这将用于将当前聚合上下文缩小到一组特定的文档。

GET /test-agg-cars/_search
{
  "size": 0,
  "aggs": {
    "make_by": {
      "filter": { "term": { "type": "honda" } },
      "aggs": {
        "avg_price": { "avg": { "field": "price" } }
      }
    }
  }
}

结果如下:

对filter进行分组聚合:filters

设计一个新的例子, 日志系统中,每条日志都是在文本中,包含warning/info等信息。

PUT /test-agg-logs/_bulk?refresh
{ "index" : { "_id" : 1 } }
{ "body" : "warning: page could not be rendered" }
{ "index" : { "_id" : 2 } }
{ "body" : "authentication error" }
{ "index" : { "_id" : 3 } }
{ "body" : "warning: connection timed out" }
{ "index" : { "_id" : 4 } }
{ "body" : "info: hello pdai" }

我们需要对包含不同日志类型的日志进行分组,这就需要filters:

GET /test-agg-logs/_search
{
  "size": 0,
  "aggs" : {
    "messages" : {
      "filters" : {
        "other_bucket_key": "other_messages",
        "filters" : {
          "infos" :   { "match" : { "body" : "info"   }},
          "warnings" : { "match" : { "body" : "warning" }}
        }
      }
    }
  }
}

结果如下:

对number类型聚合:Range

基于多桶值源的聚合,使用户能够定义一组范围-每个范围代表一个桶。在聚合过程中,将从每个存储区范围中检查从每个文档中提取的值,并“存储”相关/匹配的文档。请注意,此聚合包括from值,但不包括to每个范围的值。

GET /test-agg-cars/_search
{
  "size": 0,
  "aggs": {
    "price_ranges": {
      "range": {
        "field": "price",
        "ranges": [
          { "to": 20000 },
          { "from": 20000, "to": 40000 },
          { "from": 40000 }
        ]
      }
    }
  }
}

结果如下:

对IP类型聚合:IP Range

专用于IP值的范围聚合。

GET /ip_addresses/_search
{
  "size": 10,
  "aggs": {
    "ip_ranges": {
      "ip_range": {
        "field": "ip",
        "ranges": [
          { "to": "10.0.0.5" },
          { "from": "10.0.0.5" }
        ]
      }
    }
  }
}

返回

{
  ...

  "aggregations": {
    "ip_ranges": {
      "buckets": [
        {
          "key": "*-10.0.0.5",
          "to": "10.0.0.5",
          "doc_count": 10
        },
        {
          "key": "10.0.0.5-*",
          "from": "10.0.0.5",
          "doc_count": 260
        }
      ]
    }
  }
}
  • CIDR Mask分组

此外还可以用CIDR Mask分组

GET /ip_addresses/_search
{
  "size": 0,
  "aggs": {
    "ip_ranges": {
      "ip_range": {
        "field": "ip",
        "ranges": [
          { "mask": "10.0.0.0/25" },
          { "mask": "10.0.0.127/25" }
        ]
      }
    }
  }
}

返回

{
  ...

  "aggregations": {
    "ip_ranges": {
      "buckets": [
        {
          "key": "10.0.0.0/25",
          "from": "10.0.0.0",
          "to": "10.0.0.128",
          "doc_count": 128
        },
        {
          "key": "10.0.0.127/25",
          "from": "10.0.0.0",
          "to": "10.0.0.128",
          "doc_count": 128
        }
      ]
    }
  }
}
  • 增加key显示
GET /ip_addresses/_search
{
  "size": 0,
  "aggs": {
    "ip_ranges": {
      "ip_range": {
        "field": "ip",
        "ranges": [
          { "to": "10.0.0.5" },
          { "from": "10.0.0.5" }
        ],
        "keyed": true // here
      }
    }
  }
}

返回

{
  ...

  "aggregations": {
    "ip_ranges": {
      "buckets": {
        "*-10.0.0.5": {
          "to": "10.0.0.5",
          "doc_count": 10
        },
        "10.0.0.5-*": {
          "from": "10.0.0.5",
          "doc_count": 260
        }
      }
    }
  }
}
  • 自定义key显示
GET /ip_addresses/_search
{
  "size": 0,
  "aggs": {
    "ip_ranges": {
      "ip_range": {
        "field": "ip",
        "ranges": [
          { "key": "infinity", "to": "10.0.0.5" },
          { "key": "and-beyond", "from": "10.0.0.5" }
        ],
        "keyed": true
      }
    }
  }
}

返回

{
  ...

  "aggregations": {
    "ip_ranges": {
      "buckets": {
        "infinity": {
          "to": "10.0.0.5",
          "doc_count": 10
        },
        "and-beyond": {
          "from": "10.0.0.5",
          "doc_count": 260
        }
      }
    }
  }
}

对日期类型聚合:Date Range

专用于日期值的范围聚合。

GET /test-agg-cars/_search
{
  "size": 0,
  "aggs": {
    "range": {
      "date_range": {
        "field": "sold",
        "format": "yyyy-MM",
        "ranges": [
          { "from": "2014-01-01" },  
          { "to": "2014-12-31" } 
        ]
      }
    }
  }
}

结果如下:

此聚合与Range聚合之间的主要区别在于 from和to值可以在Date Math表达式在新窗口打开中表示,并且还可以指定日期格式,通过该日期格式将返回from and to响应字段。请注意,此聚合包括from值,但不包括to每个范围的值

对柱状图功能:Histrogram

直方图 histogram 本质上是就是为柱状图功能设计的。

创建直方图需要指定一个区间,如果我们要为售价创建一个直方图,可以将间隔设为 20,000。这样做将会在每个 $20,000 档创建一个新桶,然后文档会被分到对应的桶中。

对于仪表盘来说,我们希望知道每个售价区间内汽车的销量。我们还会想知道每个售价区间内汽车所带来的收入,可以通过对每个区间内已售汽车的售价求和得到。

可以用 histogram 和一个嵌套的 sum 度量得到我们想要的答案:

GET /test-agg-cars/_search
{
   "size" : 0,
   "aggs":{
      "price":{
         "histogram":{ 
            "field": "price.keyword",
            "interval": 20000
         },
         "aggs":{
            "revenue": {
               "sum": { 
                 "field" : "price"
               }
             }
         }
      }
   }
}
  1. histogram 桶要求两个参数:一个数值字段以及一个定义桶大小间隔。
  2. sum 度量嵌套在每个售价区间内,用来显示每个区间内的总收入。

如我们所见,查询是围绕 price 聚合构建的,它包含一个 histogram 桶。它要求字段的类型必须是数值型的同时需要设定分组的间隔范围。 间隔设置为 20,000 意味着我们将会得到如 [0-19999, 20000-39999, ...] 这样的区间。

接着,我们在直方图内定义嵌套的度量,这个 sum 度量,它会对落入某一具体售价区间的文档中 price 字段的值进行求和。 这可以为我们提供每个售价区间的收入,从而可以发现到底是普通家用车赚钱还是奢侈车赚钱。

响应结果如下:

结果很容易理解,不过应该注意到直方图的键值是区间的下限。键 0 代表区间 0-19,999 ,键 20000 代表区间 20,000-39,999 ,等等。

当然,我们可以为任何聚合输出的分类和统计结果创建条形图,而不只是 直方图 桶。让我们以最受欢迎 10 种汽车以及它们的平均售价、标准差这些信息创建一个条形图。 我们会用到 terms 桶和 extended_stats 度量:

GET /test-agg-cars/_search
{
  "size" : 0,
  "aggs": {
    "makes": {
      "terms": {
        "field": "make.keyword",
        "size": 10
      },
      "aggs": {
        "stats": {
          "extended_stats": {
            "field": "price"
          }
        }
      }
    }
  }
}

上述代码会按受欢迎度返回制造商列表以及它们各自的统计信息。我们对其中的 stats.avg 、 stats.count 和 stats.std_deviation 信息特别感兴趣,并用 它们计算出标准差:

std_err = std_deviation / count

对应报表:

参考文章

https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-bucket.html

https://www.elastic.co/guide/cn/elasticsearch/guide/current/_aggregation_test_drive.html

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

es详解-聚合-聚合查询之bucket聚合详解

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

es详解-聚合-聚合查询之bucket聚合详解

除了查询之外,最常用的聚合了,ElasticSearch提供了三种聚合方式: 桶聚合(Bucket Aggregation),指标聚合(Metric Aggregation) 和 管道聚合(Pipline Aggregation)。本文主要讲讲桶聚合(Bucket Aggregation)。ES详解 - 聚合:聚合查询
es详解-聚合-聚合查询之bucket聚合详解
2024-04-02

es详解-聚合-聚合查询之metric聚合详解

前文主要讲了 ElasticSearch提供的三种聚合方式之桶聚合(Bucket Aggregation),本文主要讲讲指标聚合(Metric Aggregation)。ES详解 - 聚合:聚合查询之Metric聚合详解如何理解metric聚合单值分析: 标准stat类型avg 平均值max 最大值min 最小值sum
es详解-聚合-聚合查询之metric聚合详解
2024-04-02

es详解-聚合-聚合查询之pipline聚合详解

前文主要讲了 ElasticSearch提供的三种聚合方式之指标聚合(Metric Aggregation),本文主要讲讲管道聚合(Pipeline Aggregation)。简单而言就是让上一步的聚合结果成为下一个聚合的输入,这就是管道。ES详解 - 聚合:聚合查询之Pipline聚合详解如何理解pipeline聚合
es详解-聚合-聚合查询之pipline聚合详解
2024-04-02

es详解-入门-查询和聚合的基础使用

安装完ElasticSearch 和 Kibana后,为了快速上手,我们通过官网GitHub提供的一个数据进行入门学习,主要包括查询数据和聚合数据。ES详解 - 入门:查询和聚合的基础使用入门:从索引文档开始学习准备:批量索引文档查询数据查询所有分页查询(from+size)指定字段查询:match查询段落匹配:mat
es详解-入门-查询和聚合的基础使用
2024-04-02

es详解-查询-dsl查询之复合查询详解

在查询中会有多种条件组合的查询,在ElasticSearch中叫复合查询。它提供了5种复合查询方式:bool query(布尔查询)、boosting query(提高查询)、constant_score(固定分数查询)、dis_max(最佳匹配查询)、function_score(函数查询)。ES详解 - 查询:DS
es详解-查询-dsl查询之复合查询详解
2024-04-02

编程热搜

  • Mysql分表查询海量数据和解决方案
    众所周知数据库的管理往往离不开各种的数据优化,而要想进行优化通常我们都是通过参数来完成优化的。那么到底这些参数有哪些呢?为此在本篇文章中编程学习网笔者就为大家简单介绍MySQL,以供大家参考参考,希望能帮助到大家。以上就是关于大数据的知识点了。喜欢的可以分享给你的朋友,也可以点赞噢~更多内容,就在编程学习网!
    Mysql分表查询海量数据和解决方案
  • 大数据的妙用及17年趋势
    2017年,支持大量结构化和非结构化数据的系统将继续增长。市场需要数据平台来帮助数据管理人员管理和保护大数据,同时允许最终用户进行数据分析。这些系统将逐步成熟,在企业内部的IT系统中更好地运行。所以,我们更要了解大数据!互联网普及使得网民的行为更加多元化,通过互联网产生的数据发展更加迅猛,更具代表性。互联网世界中的商品信息、社交媒体中的图片、文本信息以及视频网站的视频信息,互联网世界中的人与人交互信息、位置信息等,都已经成为大数据的最重要也是增长最快的来源。大家都了解到了吗!更多内容就在编程学习网哟
    大数据的妙用及17年趋势
  • 5G大数据时代空降来袭
    欢迎各位阅读本篇文章,本文主要讲了5G大数据时代。如今 5G 概念已不再陌生,按照行业认同的说法:2017年至2018年 5G 将在国内开始有序测试,2019年进行预商用。工信部之前已表示,中国将在2020年启动 5G 商用。编程学习网教育平台提醒各位:本篇文章纯干货~因此大家一定要认真阅读本篇文章哦!
    5G大数据时代空降来袭
  • es详解-原理-从图解构筑对es原理的初步认知
    在学习ElasticSearch原理时,我推荐你先通过官方博客中的一篇图解文章(虽然是基于2.x版本)来构筑对ES的初步认知(这种认识是体系上的快速认知)。ES详解 - 原理:从图解构筑对ES原理的初步认知前言图解ElasticSearch图解LuceneSegmentInverted IndexStored Fiel
    es详解-原理-从图解构筑对es原理的初步认知
  • elasticsearch-wrapperquery
    在工作中遇到ElasticSearch版本升级时出现Java High Level接口变更导致的兼容性问题: 之前使用的是2.4.x,考虑性能和功能的增强,需要更换为6.4.x; 2.4.x中我们使用DSL语句直接查询(数据的不确定性和方便动态建立查询规则等因素),而新的ES Java 高阶API中去掉了相关接口的支持
    elasticsearch-wrapperquery
  • 学习大数据营销思维(下)
    编程学习网: 其实,通过上面的介绍,我们知道苹果通过各类产品与服务销售相互促进以理及薄利多销的方式来盈利第二种战略联盟类型是合作方的共同赢利。苹果公司打造了一个参与方共同受益的业务系统。
    学习大数据营销思维(下)
  • 纯干货:HLS 协议详解及优化技术全面解析
    编程学习网:HLS (HTTP Live Streaming), 是由 Apple 公司实现的基于 HTTP 的媒体流传输协议。他跟 DASH 协议的原理非常类似,通过将整条流切割成一个小的可以通过 HTTP 下载的媒体文件,然后提供一个配套的媒体列表文件给客户端,让客户端顺序地拉取这些媒体文件播放, 来实现看上去是在播放一条流的效果。HLS 目前广泛地应用于点播和直播领域。
    纯干货:HLS 协议详解及优化技术全面解析
  • 关于Python 代码全面分析
    欢迎各位阅读本篇,Python(KK 英语发音:/ˈpaɪθən/)是一种面向对象、直译式计算机程序设计语言。本篇文章讲述了关于Python 代码全面分析。
    关于Python 代码全面分析
  • es详解-原理-es原理之索引文档流程详解
    ElasticSearch中最重要原理是文档的索引和文档的读取,本文带你理解ES文档的索引过程。ES详解 - 原理:ES原理之索引文档流程详解文档索引步骤顺序单个文档多个文档文档索引过程详解整体的索引流程分步骤看数据持久化过程深入ElasticSearch索引文档的实现机制写操作的关键点Lucene的写Elastics
    es详解-原理-es原理之索引文档流程详解
  • 五大“网管”必备的网络数据分析工具
    是不是在为如何分析统计网络数据和流量烦恼呢?想不想监控、运维、排障轻松一些?下面给大家提供一些免费网络分析工具,以帮助大家更好的掌控自己的网络!编程学习网教育
    五大“网管”必备的网络数据分析工具

目录