ElasticSearch 2 (34) - 信息聚合系列之多值排序
2016-03-24 17:35
555 查看
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
相关文章推荐
- 数据库基础
- 安装sqlmap+python正确姿势
- android控件的对齐方式
- dao层用Hibernate 查询 返回null无值、并且控制台没有输出SQL日志,也没有报任何异常
- GamePlayKit的ECS“实体-组件-系统”
- 图片文件Exif信息详细说明
- Spring
- MethodSchedulerNoExtends,无缝方法调度器
- 使用MediaStore.Images和 Cursor查询本地图片和图片缩略图
- sqlyog不用密码登陆(强制取消)
- 出差(二十九)
- oracle communities
- winform DataGridView 自适应列宽
- 两个很实用很方便的函数核心及用法{(lower_bound)+(max_element))~~
- 数组指针和指针数组
- Java this 关键字返回当前类实例变量
- DAC驱动
- 理解 组件-实体-系统 (ECS \CES)游戏编程模型
- C#中,使用正式表达式匹配获取所需数据
- 在SqlServer2008R2中,在一张表上加上insert、update、delete触发器(带游标)