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) - 信息聚合系列之测试驱动 摘要 我们可以用以下几页定义不同的聚合和它们的语法,但学习聚合的最佳途径就是用实例来说明.一旦我们获得了聚合的思想,以及如何合理地 ...
随机推荐
- 面向对象的JavaScript --- 动态类型语言
面向对象的JavaScript --- 动态类型语言 动态类型语言与面向接口编程 JavaScript 没有提供传统面向对象语言中的类式继承,而是通过原型委托的方式来实现对象与对象之间的继承. Jav ...
- linux,添加新硬盘的方法
一.物理机添加一块新的硬盘方法(目的是把后加的磁盘直接加在现有的上面,不用再分区挂载)1.首先要确定现有系统在那块盘上 [root@localhost ~]# df -lhFilesystem ...
- Linq EF 添加数据执行事务处理
在EF4.1的DBContext中实现事务处理(BeginTransaction)和直接执行SQL语句的示例 2012-12-12 10:39 5538人阅读 ...
- N皇后问题 各种优化
0.问题引入 N皇后问题是一个经典的问题,在一个N*N的棋盘上放置N个皇后,每行一个并使其不能互相攻击(同一行.同一列.同一斜线上的皇后都会自动攻击),问有多少种摆法. 题目链接:https://ww ...
- 2018-2019-2 20165302 《网络对抗技术》Exp3 免杀原理与实践
一,实验要求 (我是真的不知道为什么截图中都有学号和姓名信息了还要求改主机名......而且实验要求里也没有明确说.做完之后听别人说的,肯定是不能重新截图了,要扣分就扣吧) 通过本部分内容的学习,认识 ...
- php5.6.40编译安装
yum install gcc bison bison-devel zlib-devel libmcrypt-devel mcrypt mhash-devel openssl-devel libxml ...
- Landen邀请码
Y2PZ6U8 landen 输入邀请码,注册一年会额外赠送一个月,注册两年会额外赠送三个月.
- VS编程,WPF中,获取鼠标相对于当前程序窗口的坐标的一种方法
原文:VS编程,WPF中,获取鼠标相对于当前程序窗口的坐标的一种方法 版权声明:我不生产代码,我只是代码的搬运工. https://blog.csdn.net/qq_43307934/article/ ...
- Vue 项目集合
饿了么安全应急响应中心 饿了么招聘 饿了么前端 · GitHub 稀土掘金 异乡好居 明星垂搜 广州建管 基于Vue.js的数据统计系统(一) 基于Vue.js的数据统计系统(二) 基于Vue.js的 ...
- POJ3267
从今天开始POJ里的一部分类型的题目就一般不放在一起写了 一个是太丑,格式麻烦,第二个是以后的题目难度都有所增大,因此一道题可能就要写蛮长 尤其是DP这一块,以前一直没好好学习,现在从基础的先开始吧 ...