es 结果排序

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了es 结果排序相关的知识,希望对你有一定的参考价值。

参考技术A 以下是本次实战的环境信息,请确保您的Elasticsearch可以正常运行:

实战用的数据依然是一些汽车销售的记录,在 第一章 有详细的导入步骤,请参考操作,导入后您的es中的数据如下图:

接下来一起实战聚合排序吧;

之前文章中的聚合查询,我们都没有做排序设置,此时es会用每个桶的doc_count字段做降序,下图是个terms桶聚合的示例,可见返回了三个bucket对象,是按照doc_count字段降序排列的:

除了自定义排序,es自身也内置了两种排序参数,可以直接拿来使用:

返回结果如下,已经按照key的大小从大到小排序:

《Elasticsearch 权威指南》 里指出:_key只在 histogram 和 date_histogram 内使用,原文如下图红框所示:

但是在实际操作中发现,6.7.1版本中,除了histogram 和 date_histogram,terms桶也可以用_key排序,如下图,是按照key的字母降序:

把desc改为asc之后返回如下图,变成了按照key的首字母升序排序:

3. 另外 《Elasticsearch 权威指南》 中还提到一种内置排序类型_term,但是 《Elasticsearch官方文档》 中宣布该类型在6.0之后已经废弃,如下:

也许是"手贱"的缘故,我还是用_term试了下,可以返回结果,但是会建议用_key替代_term,如下图:

常见的metrics有累加和(sum)、最大值(max)、最小值(min)、平均值(avg),这些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的聚合有关的关键知识点;

以上是关于es 结果排序的主要内容,如果未能解决你的问题,请参考以下文章

elasticsearch(es)查询api,结果集排序,分页,范围查询

es根据一个字段分组聚合另一个字段进行排序

ES聚合过滤与排序

ES学习11-多桶排序

es数组内容排序;脚本排序

es数组内容排序;脚本排序