ElasticSearch之排序,fielddata和docvalue

2024-03-07 06:44

本文主要是介绍ElasticSearch之排序,fielddata和docvalue,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

写在前面

es搜索返回结果的排序默认是按照得分的高低来排的,本文来看下如何按照字段来排序,实现类似于MySQL的order by xxx的效果。

1:什么是fileddata和doc_value

参考ElasticSearch之零碎知识点 和一文带你彻底弄懂ES中的doc_values和fielddata 。

2:实例

测试数据参考这篇文章 。

  • 先来看日期字段排序的查询:
POST kibana_sample_data_ecommerce/_search
{"size": 5,"query": {"match_all": {}},"sort": [{"order_date": {"order": "desc"}}]
}

在这里插入图片描述
可以正常查询,但是注意此时因为不需要根据算分来排序,所以是就没有计算得分了。

  • 看下多字段排序
POST kibana_sample_data_ecommerce/_search
{"size": 5,"query": {"match_all": {}},"sort": [{"order_date": {"order": "desc"},"_doc": {"order": "asc"},"_score": {"order": "desc"}}]
}

_doc 是按照文档的索引顺序排序。

_score是按照得分来排序,因此此时就要计算得分了。

在这里插入图片描述

  • 基于text字段的排序
POST kibana_sample_data_ecommerce/_search
{"size": 5,"query": {"match_all": {}},"sort": [{"customer_full_name": {"order": "desc"}}]
}

在这里插入图片描述
报错了,这是因为text字段类型默认是关闭fielddata的,因此想要对text类型使用排序,需要显式的在mapping中打开。

上述,日期不报错,是因为日期是默认打开doc_values的,因为在实际业务中我们按照日期排序的场景很多,类似的整形也是打开doc_values的。但text类型因为数据结构本身的限制,所以是不支持doc_values的,所以只能通过打开fielddata来完成排序需求。

  • 打开text的fielddata
PUT kibana_sample_data_ecommerce/_mapping
{"properties": {"customer_full_name": {"type": "text","fielddata": true,"fields": {"keyword": {"type": "keyword","ignore_above": 256}}}}
}

在执行上述的查询就正常了:
在这里插入图片描述

  • 最佳实践
    在业务中,如果是确定不需要的字段可以显式的关闭doc_values和fielddata。减少索引的速度,以及jvm heap和磁盘空间的占用。

写在后面

参考文章列表

ElasticSearch之零碎知识点 。

这篇关于ElasticSearch之排序,fielddata和docvalue的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/782665

相关文章

SpringBoot简单整合ElasticSearch实践

《SpringBoot简单整合ElasticSearch实践》Elasticsearch支持结构化和非结构化数据检索,通过索引创建和倒排索引文档,提高搜索效率,它基于Lucene封装,分为索引库、类型... 目录一:ElasticSearch支持对结构化和非结构化的数据进行检索二:ES的核心概念Index:

Elasticsearch 的索引管理与映射配置实战指南

《Elasticsearch的索引管理与映射配置实战指南》在本文中,我们深入探讨了Elasticsearch中索引与映射的基本概念及其重要性,通过详细的操作示例,我们了解了如何创建、更新和删除索引,... 目录一、索引操作(一)创建索引(二)删除索引(三)关闭索引(四)打开索引(五)索引别名二、映射操作(一

Java Map排序如何按照值按照键排序

《JavaMap排序如何按照值按照键排序》该文章主要介绍Java中三种Map(HashMap、LinkedHashMap、TreeMap)的默认排序行为及实现按键排序和按值排序的方法,每种方法结合实... 目录一、先理清 3 种 Map 的默认排序行为二、按「键」排序的实现方式1. 方式 1:用 TreeM

C++归并排序代码实现示例代码

《C++归并排序代码实现示例代码》归并排序将待排序数组分成两个子数组,分别对这两个子数组进行排序,然后将排序好的子数组合并,得到排序后的数组,:本文主要介绍C++归并排序代码实现的相关资料,需要的... 目录1 算法核心思想2 代码实现3 算法时间复杂度1 算法核心思想归并排序是一种高效的排序方式,需要用

一文详解Java Stream的sorted自定义排序

《一文详解JavaStream的sorted自定义排序》Javastream中的sorted方法是用于对流中的元素进行排序的方法,它可以接受一个comparator参数,用于指定排序规则,sorte... 目录一、sorted 操作的基础原理二、自定义排序的实现方式1. Comparator 接口的 Lam

Java List排序实例代码详解

《JavaList排序实例代码详解》:本文主要介绍JavaList排序的相关资料,Java排序方法包括自然排序、自定义排序、Lambda简化及多条件排序,实现灵活且代码简洁,文中通过代码介绍的... 目录一、自然排序二、自定义排序规则三、使用 Lambda 表达式简化 Comparator四、多条件排序五、

JAVA数组中五种常见排序方法整理汇总

《JAVA数组中五种常见排序方法整理汇总》本文给大家分享五种常用的Java数组排序方法整理,每种方法结合示例代码给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧... 目录前言:法一:Arrays.sort()法二:冒泡排序法三:选择排序法四:反转排序法五:直接插入排序前言:几种常用的Java数组排序

Mybatis 传参与排序模糊查询功能实现

《Mybatis传参与排序模糊查询功能实现》:本文主要介绍Mybatis传参与排序模糊查询功能实现,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧... 目录一、#{ }和${ }传参的区别二、排序三、like查询四、数据库连接池五、mysql 开发企业规范一、#{ }和${ }传参的

Elasticsearch 在 Java 中的使用教程

《Elasticsearch在Java中的使用教程》Elasticsearch是一个分布式搜索和分析引擎,基于ApacheLucene构建,能够实现实时数据的存储、搜索、和分析,它广泛应用于全文... 目录1. Elasticsearch 简介2. 环境准备2.1 安装 Elasticsearch2.2 J

C++快速排序超详细讲解

《C++快速排序超详细讲解》快速排序是一种高效的排序算法,通过分治法将数组划分为两部分,递归排序,直到整个数组有序,通过代码解析和示例,详细解释了快速排序的工作原理和实现过程,需要的朋友可以参考下... 目录一、快速排序原理二、快速排序标准代码三、代码解析四、使用while循环的快速排序1.代码代码1.由快