博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ElasticSearch 2 (32) - 信息聚合系列之范围限定
阅读量:6253 次
发布时间:2019-06-22

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

ElasticSearch 2 (32) - 信息聚合系列之范围限定

摘要

到目前为止我们看到的所有聚合的例子都省略了搜索请求,完整的请求就是聚合本身。

聚合与搜索请求同时执行,但是我们需要理解一个新概念:范围。默认情况下,聚合与查询是对同一范围进行操作的,也就是说,聚合是基于我们查询匹配的文档集合进行计算的。

版本

elasticsearch版本: elasticsearch-2.x

内容

到目前为止我们看到的所有聚合的例子都省略了搜索请求,完整的请求就是聚合本身。

聚合与搜索请求同时执行,但是我们需要理解一个新概念:范围。默认情况下,聚合与查询是对同一范围进行操作的,也就是说,聚合是基于我们查询匹配的文档集合进行计算的。

让我们看看第一个聚合的示例:

GET /cars/transactions/_search  {      "size" : 0,      "aggs" : {          "colors" : {              "terms" : {                "field" : "color"              }          }      }  }

我们可以看到聚合是隔离的。现实中,Elasticsearch 认为 “没有指定查询” 和 “查询所有文档” 是等价的。前面这个查询内部会翻译成:

GET /cars/transactions/_search  {      "size" : 0,      "query" : {          "match_all" : {}      },      "aggs" : {          "colors" : {              "terms" : {                "field" : "color"              }          }      }  }

因为聚合总是对查询范围内的结果进行操作的,所以一个隔离的聚合实际上是在对 match_all 的结果范围操作,即所有的文档。

一旦有了范围的概念,我们就能更进一步对聚合进行自定义。我们前面所有的示例都是对所有数据计算统计信息的:销量最高好的汽车,所有汽车的平均售价,最佳销售月份等等。

利用范围,我们可以问“福特在售车有多少种颜色?”诸如此类的问题。可以简单的在请求中加上一个查询(本例中为 match 查询):

GET /cars/transactions/_search  {      "query" : {          "match" : {              "make" : "ford"          }      },      "aggs" : {          "colors" : {              "terms" : {                "field" : "color"              }          }      }  }

因为我们没有指定 "size" : 0,所以搜索结果和聚合结果都被返回了:

{  ...     "hits": {        "total": 2,        "max_score": 1.6931472,        "hits": [           {              "_source": {                 "price": 25000,                 "color": "blue",                 "make": "ford",                 "sold": "2014-02-12"              }           },           {              "_source": {                 "price": 30000,                 "color": "green",                 "make": "ford",                 "sold": "2014-05-18"              }           }        ]     },     "aggregations": {        "colors": {           "buckets": [              {                 "key": "blue",                 "doc_count": 1              },              {                 "key": "green",                 "doc_count": 1              }           ]        }     }  }

This may seem trivial, but it is the key to advanced and powerful dashboards. You can transform any static dashboard into a real-time data exploration device by adding a search bar. This allows the user to search for terms and see all of the graphs (which are powered by aggregations, and thus scoped to the query) update in real time. Try that with Hadoop!

看上去这并没有什么,但却对高大上的仪表盘来说至关重要。加入一个搜索信息是无法将任何静态的仪表板变成一个实时数据展示仪的。这让用户可以搜索数据,查看所有实时更新的图形(由于聚合的支持以及对查询范围的限定)。这是 Hadoop 无法做到的!

全局桶(Global Bucket)

通常我们希望聚合是在查询范围内的,但有时我们也想要搜索它的子集,而聚合的对象却是 所有 数据。

例如,比方说我们想知道福特汽车与 所有 汽车平均售价的比较。我们可以用普通的聚合(查询范围内的)得到第一个信息,然后用全局桶获得第二个信息。

全局桶包含所有的文档,它无视查询的范围,因为它还是一个桶,我们可以像平常一样将聚合嵌套在内:

GET /cars/transactions/_search  {      "size" : 0,      "query" : {          "match" : {              "make" : "ford"          }      },      "aggs" : {          "single_avg_price": {              "avg" : { "field" : "price" } #1          },          "all": {              "global" : {}, #2              "aggs" : {                  "avg_price": {                      "avg" : { "field" : "price" } #3                  }              }          }      }  }

#1 聚合操作在查询范围内(例如:所有文档匹配 ford

#2 global 全局桶没有参数。

#3 聚合操作针对所有文档,忽略汽车品牌。

single_avg_price 度量计算是基于查询范围内所有文档,即所有福特汽车。 avg_price 度量是嵌套在全局桶下的,这意味着它完全忽略了范围并对所有文档进行计算。聚合返回的平均值是所有汽车的平均售价。

如果能一直坚持读到这里,应该知道我们有个真言:尽可能的使用过滤器。它同样可以应用于聚合,在下一章中,我们会展示如何对聚合结果进行过滤而不是仅对查询范围做限定。

参考

转载地址:http://rltsa.baihongyu.com/

你可能感兴趣的文章
javascript运算符优先级
查看>>
Spring Cloud 学习 (七) Spring Cloud Sleuth
查看>>
使用docker api
查看>>
Log4j简单配置解析
查看>>
游戏上线... 记录下...
查看>>
js运动 淡入淡出
查看>>
leetcode 75颜色分类
查看>>
程序员求职成功路(3)
查看>>
Winform 打印PDF顺序混乱,获取打印队列
查看>>
django 快速搭建blog
查看>>
datetime.timedelta类
查看>>
SQL Server,MySQL,Oracle三者的区别
查看>>
[K/3Cloud] 在设计时复制已有表单菜单或菜单项快速建立菜单
查看>>
矩阵快速幂总结
查看>>
[spring] Ioc 基础
查看>>
关于DataTables一些小结
查看>>
win7(windows 7)系统下安装SQL2005(SQL Server 2005)图文教程
查看>>
Hibernate的基本配置
查看>>
Python 3.5 安装geohash库后import geohash失败
查看>>
总结100个英文邮件常用例句让你写作无忧
查看>>