ElasticSearch 2 (34) - 信息聚合系列之多值排序
ElasticSearch 2 (34) - 信息聚合系列之多值排序
摘要
多值桶(terms、histogram 和 date_histogram)动态生成很多桶,Elasticsearch 是如何决定这些桶展示给用户的顺序呢?
默认的,桶会根据 doc_count 降序排列,这是一个好的默认行为,因为通常我们想要找到文档中与查询条件相关的最大值:售价、人口数量、频率。但有些时候我们希望能修改这个顺序,不同的桶有着不同的处理方式。
版本
elasticsearch版本: elasticsearch-2.x
内容
多值桶(terms、histogram 和 date_histogram)动态生成很多桶,Elasticsearch 是如何决定这些桶展示给用户的顺序呢?
默认的,桶会根据 doc_count 降序排列,这是一个好的默认行为,因为通常我们想要找到文档中与查询条件相关的最大值:售价、人口数量、频率。但有些时候我们希望能修改这个顺序,不同的桶有着不同的处理方式。
排序的本质(Intrinsic Sorts)
这些排序模式是桶 固有的 能力:它们操作桶生成的数据,比如 doc_count。它们共享相同的语法,但是根据使用桶的不同会有些细微差别。
让我们做一个 terms 聚合但是按 doc_count 值的升序排序:
  GET /cars/transactions/_search
  {
      "size" : 0,
      "aggs" : {
          "colors" : {
              "terms" : {
                "field" : "color",
                "order": {
                  "_count" : "asc" #1
                }
              }
          }
      }
  }
#1 用关键字 _count ,我们可以按 doc_count 值的升序排序。
我们为聚合引入了一个 order 对象,它使我们可以根据以下值进行排序:
- _count- 按文档数排序。在 - terms、- histogram、- date_histogram内使用。
- _term- 按词项的字符串值的字母顺序排序。只在 - terms内使用。
- _key- 按每个桶的键值数值排序(理论上与 - _term类似)。只在- histogram和- date_histogram内使用。
按度量排序(Sorting by a Metric)
有时,我们会想基于度量计算的结果值进行排序。在我们的汽车销售分析仪表盘中,我们可能想按照汽车颜色创建一个销售条状图表,但按照汽车平均售价的升序进行排序。
我们可以增加一个度量,再指定 order 参数引用这个度量即可:
  GET /cars/transactions/_search
  {
      "size" : 0,
      "aggs" : {
          "colors" : {
              "terms" : {
                "field" : "color",
                "order": {
                  "avg_price" : "asc" #1
                }
              },
              "aggs": {
                  "avg_price": {
                      "avg": {"field": "price"} #2
                  }
              }
          }
      }
  }
#1 计算每个桶的平均售价。
#2 桶按照计算平均值的升序排序。
我们可以采用这种方式用任何度量排序,只需简单的引用度量的名字。不过有些度量会输出多个值。extended_stats 度量是一个很好的例子:它输出好几个度量值。
如果我们想使用多值度量进行排序,我们只需以关心的度量为关键词使用点式路径:
  GET /cars/transactions/_search
  {
      "size" : 0,
      "aggs" : {
          "colors" : {
              "terms" : {
                "field" : "color",
                "order": {
                  "stats.variance" : "asc" #1
                }
              },
              "aggs": {
                  "stats": {
                      "extended_stats": {"field": "price"}
                  }
              }
          }
      }
  }
#1 使用点式标记方式,我们可以对感兴趣的度量进行排序。
在上面这个例子中,我们按每个桶的方差来排序,所以售价方差最小的会出现在方差更多之前。
基于“深度”度量排序(Sorting Based on "Deep" Metrics)
在前面的示例中,度量是桶的直接子节点。平均售价是根据每个 term 来计算的。在一定条件下,我们也有可能对更深的度量进行排序,比如孙子桶或从孙桶。
我们可以定义更深的路径,将度量用尖括号(>)嵌套起来,像这样: my_bucket>another_bucket>metric。
需要提醒的是嵌套路径上的每个桶都必须是单值的。filter 桶生成一个单值桶:所有与过滤条件匹配的文档都在桶中。多值桶(如:terms)动态生成许多桶,无法通过指定一个确定路径来识别。
目前,只有三个单值桶:filter、global 和 reverse_nested。让我们快速用示例说明,创建一个汽车售价的直方图,但是按照红色和绿色(不包括蓝色)车各自的方差来排序:
  GET /cars/transactions/_search
  {
      "size" : 0,
      "aggs" : {
          "colors" : {
              "histogram" : {
                "field" : "price",
                "interval": 20000,
                "order": {
                  "red_green_cars>stats.variance" : "asc" #1
                }
              },
              "aggs": {
                  "red_green_cars": {
                      "filter": { "terms": {"color": ["red", "green"]}}, #2
                      "aggs": {
                          "stats": {"extended_stats": {"field" : "price"}} #3
                      }
                  }
              }
          }
      }
  }
#1 按照嵌套度量的方差对桶的直方图进行排序。
#2 因为我们使用单值过滤器,我们可以使用嵌套排序。
#3 按照生成的度量对统计结果进行排序。
本例中,可以看到我们如何访问一个嵌套的度量,stats 度量是 red_green_cars 聚合的子节点,而red_green_cars  又是 colors 聚合的子节点。为了根据这个度量排序,我们定义了路径  red_green_cars>stats.variance 。我们可以这么做,因为 filter 桶是个单值桶。
参考
elastic.co:
Sorting Multivalue Buckets
ElasticSearch 2 (34) - 信息聚合系列之多值排序的更多相关文章
- ElasticSearch 2 (37) - 信息聚合系列之内存与延时
		ElasticSearch 2 (37) - 信息聚合系列之内存与延时 摘要 控制内存使用与延时 版本 elasticsearch版本: elasticsearch-2.x 内容 Fielddata ... 
- ElasticSearch 2 (36) - 信息聚合系列之显著项
		ElasticSearch 2 (36) - 信息聚合系列之显著项 摘要 significant_terms(SigTerms)聚合与其他聚合都不相同.目前为止我们看到的所有聚合在本质上都是简单的数学 ... 
- ElasticSearch 2 (38) - 信息聚合系列之结束与思考
		ElasticSearch 2 (38) - 信息聚合系列之结束与思考 摘要 版本 elasticsearch版本: elasticsearch-2.x 内容 本小节涵盖了许多基本理论以及很多深入的技 ... 
- ElasticSearch 2 (35) - 信息聚合系列之近似聚合
		ElasticSearch 2 (35) - 信息聚合系列之近似聚合 摘要 如果所有的数据都在一台机器上,那么生活会容易许多,CS201 课商教的经典算法就足够应付这些问题.但如果所有的数据都在一台机 ... 
- ElasticSearch 2 (33) - 信息聚合系列之聚合过滤
		ElasticSearch 2 (33) - 信息聚合系列之聚合过滤 摘要 聚合范围限定还有一个自然的扩展就是过滤.因为聚合是在查询结果范围内操作的,任何可以适用于查询的过滤器也可以应用在聚合上. 版 ... 
- ElasticSearch 2 (32) - 信息聚合系列之范围限定
		ElasticSearch 2 (32) - 信息聚合系列之范围限定 摘要 到目前为止我们看到的所有聚合的例子都省略了搜索请求,完整的请求就是聚合本身. 聚合与搜索请求同时执行,但是我们需要理解一个新 ... 
- ElasticSearch 2 (31) - 信息聚合系列之时间处理
		ElasticSearch 2 (31) - 信息聚合系列之时间处理 摘要 如果说搜索是 Elasticsearch 里最受欢迎的功能,那么按时间创建直方图一定排在第二位.为什么需要使用时间直方图? ... 
- ElasticSearch 2 (30) - 信息聚合系列之条形图
		ElasticSearch 2 (30) - 信息聚合系列之条形图 摘要 版本 elasticsearch版本: elasticsearch-2.x 内容 聚合还有一个令人激动的特性就是能够十分容易地 ... 
- ElasticSearch 2 (29) - 信息聚合系列之测试驱动
		ElasticSearch 2 (29) - 信息聚合系列之测试驱动 摘要 我们可以用以下几页定义不同的聚合和它们的语法,但学习聚合的最佳途径就是用实例来说明.一旦我们获得了聚合的思想,以及如何合理地 ... 
随机推荐
- moand的编程学形式:一个(高阶)类型包办程序的组织--类型关乎复合
			moand的编程学形式:一个(高阶)类型完成程序的组织. 将类型系统的转换与高阶函数进行了融合,相对于链式编程而言. 类型关乎复合 范畴论与箭头的复合有关.但是并非任意两个箭头都可以复合.一个箭头的目 ... 
- Grafana3.0.1+Zabbix3.0.4监控系统平台搭建
			前言 本文的Zabbix部分知识只介绍它的基础安装,Zabbix的使用以及配置优化并不在本文的介绍范围之内. 本文只介绍在CentOS6系列下的安装和部署,其他发行版与其他版本号暂不涉及 本文默认使用 ... 
- oracle 更新用户密码,授连接权限,
			1.授连接权限 grant connect to 用户名; ALTER USER 用户名 ACCOUNT UNLOCK; 2.更新密码 ALTER USER 用户名 IDENTIFIED BY 更新密 ... 
- Python2.7-copy_reg
			copy_reg 模块,提供了在 pickle 或是 copy 特定对象时,可以运行一个指定的函数,作为对象的构造器 模块方法: copy_reg.constructor(object):声明一个可调 ... 
- Android 多用户多缓存的简单处理方案
			需求:1.在缓存中记录用户登录信息.例如:用户名,密码 2.记录用户操作数据.例如:是否记住用户名密码.设置7天内自动登录等 简单设计:1)使用sqlite设计一张用户数据表,有用户名.密码.操作数据 ... 
- day 21 今日学习内容
			今日没有学习新的内容,可能今天就是对于前一段时间学习的总结,今天做了一个相对之前作业更加完善的ATM+购物车,在今天的学习里,我对于编程有了新的见解,编程并非一味的for..if...for...更多 ... 
- 利用WebHook实现PHP自动部署Git代码
			平时项目代码都托管在Coding,然后每次提交了代码之后都要SSH到服务器上去git pull一次,很是繁琐,在看了OverTrue的<使用PHP脚本远程部署git项目>后就尝试在自己服务 ... 
- 20155227《网络对抗》Exp4 恶意代码分析
			20155227<网络对抗>Exp4 恶意代码分析 实践目标 1.是监控你自己系统的运行状态,看有没有可疑的程序在运行. 2.是分析一个恶意软件,就分析Exp2或Exp3中生成后门软件:分 ... 
- 20155305乔磊《网络对抗》逆向及Bof基础
			20155305乔磊<网络对抗>逆向及Bof基础 实践目标 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何 ... 
- OpenGL 笔记 <2> Compiling and Linking a shader program
			Preface 这一节所有的主要内容都在一个OpenGL库文件中<LoadShaders.h> ,只需要用LoadShader()函数进行加载即可.但是由于老是出错,所以自己实现了一下,也 ... 
