《深入理解ElasticSearch》——2.5 排序

本文涉及的产品
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
简介:

本节书摘来自华章计算机《深入理解ElasticSearch》一书中的第2章,第2.5节,作者:[美] 拉斐尔·酷奇(Rafa Ku) 马雷克·罗戈任斯基(Marek Rogoziński)更多章节内容可以访问云栖社区“华章计算机”公众号查看。

2.5 排序

当你发送查询至ElasticSearch,返回文档默认按文档得分降序排序(文档评分计算详见2.1节)。这种排序策略通常是我们想要的,即第一个文档是与查询最相关的。然而,有时候我们希望能改变这种排序方式。下面这个例子就很容易做到,因为我们在查询中只使用了简单的词项字符串。请查看下面的范例:


<a href=https://yqfile.alicdn.com/170f535c2158b96fc04ffb7ef790fcecc7701d19.png" >

该查询范例会返回所有在title字段上至少命中一个词项的文档,并基于section字段数据排序。
也可以通过添加查询的sort部分的missing属性为那些section字段有缺失值的文档定制排序行为。例如,这样设置之前查询范例的sort配置,将section字段值缺失的文档排在最后:

0b59a6ba4a7d0b983619c781acf1046de1f2b2ee

2.5.1 基于多值字段的排序
在0.90版本之前,ElasticSearch在基于多值字段排序时存在一些问题。尝试这种排序时,通常会导致下面这种错误:[Can抰 sort on string types with more than one value per doc, or more than one token per field]。事实上,基于多值字段排序没有任何意义,因为ElasticSearch并不知道依照字段的哪个值进行排序。随着ElasticSearch 0.90的出现,基于多值字段的排序变得可行了。例如,某些文档的release_dates字段里存储了多个电影上映日期(同一部电影在不同国家的上映日期不同)。如果我们使用了ElasticSearch 0.90,我们可以如此构造查询请求:

db59b5d25204cc49e384470fd8db6377b10dc7af

请注意,在本小节的范例中,查询请求的query部分是多余的(它与默认设置相同),后面的范例将不再赘述。
例子中,ElasticSearch将基于每个文档的release_dates字段的最小值进行排序。mode参数可以设置为以下这些值:
  • min:升序排序的默认值,ElasticSearch将依照该字段的最小值进行排序。
  • max:降序排序的默认值,ElasticSearch将依照该字段的最大值进行排序。
  • avg:ElasticSearch将依照该字段的平均值进行排序。
  • sum:ElasticSearch将依照该字段的总和进行排序。

请注意,后面两个选项只对数值类型字段有效。尽管目前的版本能对文本类型字段使用avg和sum选项,但是返回结果可能并不符合用户的预期,因此并不鼓励使用这种用法。
2.5.2 基于多值geo字段的排序
ElasticSearch的0.92.0RC2版本提供了基于多维坐标数据的排序。从用户角度来看,这种排序与前面提到的排序没有什么区别。现在,我们通过一个真实的例子来进一步了解这种类型的排序。例如,要查找特定国家里离自己最近的一个机构。假设我们使用下面这个映射:


<a href=https://yqfile.alicdn.com/22446a781905462a47aababdede14d81f88ac9e0.png" >

同时,使用下面这条数据记录:


<a href=https://yqfile.alicdn.com/2d3c397df30de1448905116a7a1e32f13002cf29.png" >

我们的查询也很简单,如下所示:

5baf7a30351320293ad173de2e576d596db81fbd

正如你所见,我们有一个文档,文档中存储了多个地理位置的坐标。现在,我们执行查询并查看结果:

<a href=https://yqfile.alicdn.com/39a3da3d4cc798ba717d56b8b46278619db873d2.png" >

从中可以看到,返回结果包含这个值:"sort" : [ 0.0 ]。这是因为返回文档中的地理坐标与查询中的坐标精确匹配。如果我们在查询中配置mode属性的值为max,则会返回一个不同的值,返回结果的高亮部分就会是下面的值:

在Elas


b0ddbadd99b39b86847e6cb8c3efa96503dcaddf
ticSearch 0.90.1版本中,可以设置mode属性的值为avg,此时可以基于字段中的地理坐标与查询中坐标的距离的均值排序。
2.5.3 基于嵌套对象的排序
本节将介绍最后一种排序技术,即在ElasticSearch 0.90及以上版本中,用户可以基于字段中定义的嵌套对象排序。基于嵌套文档的字段排序,对以下两种情形都适用:使用了显式嵌套映射(在映射中配置type="nested")的文档以及使用了对象类型的文档。但是,两者之间的一些细微区别仍需要注意。
假设我们索引了如下数据:

<a href=https://yqfile.alicdn.com/cd5f69571a4d897c604445fc2900a746dc9f6006.png" >

正如你所见,文档中有嵌套对象,并且某些字段中有多个值(如存在多张选票)。
请查看下面这个查询:

<a href=https://yqfile.alicdn.com/aaca7a4706cee00f35d4f8130b1793a3e266387e.png" >

查询返回结果按嵌套对象的users字段最小值降序排序。如果我们将嵌套文档中的子文档视为一种数据类型,则可以将查询简化为如下形式:

<a href=https://yqfile.alicdn.com/955a0c2db91fb837aa0d7311cc83c9e06bea2451.png" >

当使用对象类型(object type)时,可以简化查询,这是因为整个对象结构被当成一个Lucene文档进行存储的。而在使用嵌套类型的时候,ElasticSearch需要更多精确的字段信息,这是因为这些文档确实是独立的Lucene文档。但有些时候,使用nested_path属性会更加便捷,我们按照下面这种方式构造一个查询:

<a href=https://yqfile.alicdn.com/dfd9b6420cb862628cbae4ecc7f79a260f858d40.png" >

请记住,我们也可以使用nested_filter参数,只是该参数仅对嵌套文档有效(即那些被显式标记为嵌套文档的)。利用这个参数,我们可以在排序前就已经通过一个过滤器在检索期排除了某些文档,而不是在检索结果文档集中过滤它们。
相关实践学习
使用阿里云Elasticsearch体验信息检索加速
通过创建登录阿里云Elasticsearch集群,使用DataWorks将MySQL数据同步至Elasticsearch,体验多条件检索效果,简单展示数据同步和信息检索加速的过程和操作。
ElasticSearch 入门精讲
ElasticSearch是一个开源的、基于Lucene的、分布式、高扩展、高实时的搜索与数据分析引擎。根据DB-Engines的排名显示,Elasticsearch是最受欢迎的企业搜索引擎,其次是Apache Solr(也是基于Lucene)。 ElasticSearch的实现原理主要分为以下几个步骤: 用户将数据提交到Elastic Search 数据库中 通过分词控制器去将对应的语句分词,将其权重和分词结果一并存入数据 当用户搜索数据时候,再根据权重将结果排名、打分 将返回结果呈现给用户 Elasticsearch可以用于搜索各种文档。它提供可扩展的搜索,具有接近实时的搜索,并支持多租户。
相关文章
|
JSON Ubuntu Java
Elasticsearch聚合学习之四:结果排序
在前面的实战中,聚合的结果以桶(bucket)为单位,放在JSON数组中返回,这些数据是没有排序的,今天来学习如何给这些数据进行排序
459 0
Elasticsearch聚合学习之四:结果排序
|
4月前
|
SQL JSON 大数据
ElasticSearch的简单介绍与使用【进阶检索】 实时搜索 | 分布式搜索 | 全文搜索 | 大数据处理 | 搜索过滤 | 搜索排序
这篇文章是Elasticsearch的进阶使用指南,涵盖了Search API的两种检索方式、Query DSL的基本语法和多种查询示例,包括全文检索、短语匹配、多字段匹配、复合查询、结果过滤、聚合操作以及Mapping的概念和操作,还讨论了Elasticsearch 7.x和8.x版本中type概念的变更和数据迁移的方法。
ElasticSearch的简单介绍与使用【进阶检索】 实时搜索 | 分布式搜索 | 全文搜索 | 大数据处理 | 搜索过滤 | 搜索排序
|
7月前
|
测试技术 定位技术 API
万字长文:一文彻底搞懂Elasticsearch中Geo数据类型查询、聚合、排序
万字长文:一文彻底搞懂Elasticsearch中Geo数据类型查询、聚合、排序
95182 140
|
5月前
|
数据库
面试题ES问题之Elasticsearch的排序分页和高亮功能如何解决
面试题ES问题之Elasticsearch的排序分页和高亮功能如何解决
44 0
|
7月前
|
搜索推荐 JavaScript Java
Elasticsearch 8.X 如何依据 Nested 嵌套类型的某个字段进行排序?
Elasticsearch 8.X 如何依据 Nested 嵌套类型的某个字段进行排序?
103 0
|
7月前
|
存储 数据建模 索引
来自钉钉群的问题——Elasticsearch 如何实现文件名自定义排序?
来自钉钉群的问题——Elasticsearch 如何实现文件名自定义排序?
61 0
|
7月前
|
存储 自然语言处理 Java
SpringBoot集成ElasticSearch时分页排序查询时遇到的坑每次只能返回10条数据
SpringBoot集成ElasticSearch时分页排序查询时遇到的坑每次只能返回10条数据
250 0
|
算法 索引
Elasticsearch - 聚合获取原始数据并分页&排序&模糊查询
Elasticsearch - 聚合获取原始数据并分页&排序&模糊查询
351 0
Elasticsearch - 聚合获取原始数据并分页&排序&模糊查询
|
存储 JSON 自然语言处理
40-微服务技术栈(高级):分布式搜索引擎ElasticSearch(DSL语法、搜索结果[排序/分页/高亮]处理)
在前面的学习中,笔者带领大家完成海量数据导入ES,实现了ES基本的存储功能,但是我们知道ES最擅长的还是搜索、数据分析。所以本节笔者将继续带领大家研究一下ES的数据搜索功能,同上节一样,继续分别采用DSL和RestClient实现搜索。
146 0
|
数据挖掘
白话Elasticsearch44-深入聚合数据分析之案例实战_颜色+品牌下钻分析时按最深层metric进行排序
白话Elasticsearch44-深入聚合数据分析之案例实战_颜色+品牌下钻分析时按最深层metric进行排序
101 0