Elasticsearch 聚合学习之四:结果排序
欢迎访问我的 GitHub
这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos
本篇概览
本文是《Elasticsearch 聚合学习》系列的第四篇,在前面的实战中,聚合的结果以桶(bucket)为单位,放在 JSON 数组中返回,这些数据是没有排序的,今天来学习如何给这些数据进行排序;
系列文章列表
环境信息
以下是本次实战的环境信息,请确保您的 Elasticsearch 可以正常运行:
操作系统:Ubuntu 18.04.2 LTS
JDK:1.8.0_191
Elasticsearch:6.7.1
Kibana:6.7.1
实战用的数据依然是一些汽车销售的记录,在第一章有详细的导入步骤,请参考操作,导入后您的 es 中的数据如下图:
接下来一起实战聚合排序吧;
默认排序
之前文章中的聚合查询,我们都没有做排序设置,此时 es 会用每个桶的 doc_count 字段做降序,下图是个 terms 桶聚合的示例,可见返回了三个 bucket 对象,是按照 doc_count 字段降序排列的:
内置排序
除了自定义排序,es 自身也内置了两种排序参数,可以直接拿来使用:
_count:这个参数对应的就是 doc_count,以下请求的排序效果和默认的排序效果是一致的:
_key:在区间聚合的时候(histogram 或者 date_histogram),可以根据桶的 key 做排序:
返回结果如下,已经按照 key 的大小从大到小排序:
《Elasticsearch 权威指南》里指出:**_key**只在 histogram 和 date_histogram 内使用,原文如下图红框所示:
但是在实际操作中发现,6.7.1 版本中,除了 histogram 和 date_histogram,terms 桶也可以用**_key**排序,如下图,是按照 key 的字母降序:
把 desc 改为 asc 之后返回如下图,变成了按照 key 的首字母升序排序:
另外《Elasticsearch 权威指南》中还提到一种内置排序类型**_term**,但是《Elasticsearch官方文档》中宣布该类型在 6.0 之后已经废弃,如下:
也许是"手贱"的缘故,我还是用_term 试了下,可以返回结果,但是会建议用_key 替代_term,如下图:
按照 metrics 排序(metrics 结果只有一个值)
常见的 metrics 有累加和(sum)、最大值(max)、最小值(min)、平均值(avg),这些 metrics 的特点是处理结果只有一个值,我们可以按照这个结果来排序,例如计算每个汽车品牌的销售额,再按照销售额排序:
下面是聚合结果,可见已按照每个品牌的销售额大小做了降序的排序:
按照 metrics 排序(metrics 结果有多个值)
和 sum、max 这些只有一个结果的 metrics 不同,extended_stats 的结果包含了数量、最大值、最小值、平均值、累加和等多种处理,此时必须要指定用其中的哪一项(否则会返回错误:Invalid aggregation order path [xxxx]. When ordering on a multi-value metrics aggregation a metric name must be specified):
返回结果如下,可见已经按照 metrics 结果的 avg 子项做了升序排序:
嵌套桶排序
在聚合查询中,经常对聚合的数据再次做聚合处理,例如统计每个汽车品牌下的每种颜色汽车的销售额,这时候 DSL 中就有了多层 aggs 对象的嵌套,这就是嵌套桶(此名称来自《Elasticsearch 权威指南》),如下图所示:
嵌套桶的排序情况略为复杂,详情请参考《Elasticsearch聚合的嵌套桶如何排序》;
至此,聚合返回结果排序的实战已经完成了,后面的章节会深入学习 es 的聚合有关的关键知识点;
欢迎关注 InfoQ:程序员欣宸
版权声明: 本文为 InfoQ 作者【程序员欣宸】的原创文章。
原文链接:【http://xie.infoq.cn/article/613b65f9764961208d3b80625】。文章转载请联系作者。
评论