elasticsearch index sorting 索引预排序

2024-02-23 02:04

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

预排序概要
  Elasticsearch的底层索引工具为Lucene,Lucene通过segment进行索引文件的管理存储,默认情况下,segment中文档按照自增Id排序(写入时Lucene会分配一个Id),查询时根据文档Id顺序遍历,查找所有满足条件的文档。

因此,假设我们的检索场景为基于某字段进行排序,如果底层文件可以同样按照这个字段进行排序,那是否会带来检索的一些优化呢?

   答案是肯定的,在检索阶段:查找top k文档时,默认需要遍历所有文档才可以找到所有的相关文档,但当配置了索引排序后,如果检索排序与索引排序一致,则每个分片上只需要检索前k个文档即可,这样便可以提前结束查询,减少计算和性能损耗。
  Elasticsearch6.X版本增加了一个新功能,即Index Sorting,允许我们在索引创建时指定一个或多个字段进行排序,使用或配置方法如下:

PUT twitter
{
    "settings" : {
        "index" : {
            "sort.field" : "date", 
            "sort.order" : "desc" 
        }
    },
    "mappings": {
        "properties": {
            "date": {
                "type": "date"
            }
        }
    }
}

上述命令配置了twitter索引在写入时按照date的降序进行索引构建,即segment上的文档按照date降序排列。在检索时,如果考虑如下搜索query:

GET /twitter/_search
{
    "size": 10,
    "sort": [
        { "date": "desc" }
    ],
    “track_total_hits”: false
}

因为底层segment已经预排序,所以每个segment只需要取出前10个文档进行比较,这样可以优化每个分片的查询时间。

预排序使用说明
索引如果包含nested字段,则不可以使用;(由于Elasticsearch底层默认nested必需依赖基于doc id的排序)
索引预排序只能在索引创建时配置,中途不可以更改或添加;
检索加速时,使用track_total_hits参数后,则无法得到总的匹配文档数;
配置了index sorting,对写入速度有一定的下降,具体可以参见引文[1]腾讯团队的详细测试;(本地测试,对某索引进行reindex操作,重索引至具有索引排序的索引,es记录的峰值写入速度约为3200/s,重索引至无索引排序的索引,es记录的峰值写入速度约为6000/s)搜索性能尚未进行大规模压测
Reference
[1]. 腾讯云Elasticsearch技术团队 Elasticsearch 6.x索引预排序分析
[2]. Elasticsearch官方文档 Elasticsearch index sorting的使用
————————————————

                            版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
                        
原文链接:https://blog.csdn.net/Vancl_Wang/article/details/103137909

这篇关于elasticsearch index sorting 索引预排序的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

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

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

Elasticsearch 在 Java 中的使用教程

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

浅析CSS 中z - index属性的作用及在什么情况下会失效

《浅析CSS中z-index属性的作用及在什么情况下会失效》z-index属性用于控制元素的堆叠顺序,值越大,元素越显示在上层,它需要元素具有定位属性(如relative、absolute、fi... 目录1. z-index 属性的作用2. z-index 失效的情况2.1 元素没有定位属性2.2 元素处

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

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

Mysql中InnoDB与MyISAM索引差异详解(最新整理)

《Mysql中InnoDB与MyISAM索引差异详解(最新整理)》InnoDB和MyISAM在索引实现和特性上有差异,包括聚集索引、非聚集索引、事务支持、并发控制、覆盖索引、主键约束、外键支持和物理存... 目录1. 索引类型与数据存储方式InnoDBMyISAM2. 事务与并发控制InnoDBMyISAM

StarRocks索引详解(最新整理)

《StarRocks索引详解(最新整理)》StarRocks支持多种索引类型,包括主键索引、前缀索引、Bitmap索引和Bloomfilter索引,这些索引类型适用于不同场景,如唯一性约束、减少索引空... 目录1. 主键索引(Primary Key Index)2. 前缀索引(Prefix Index /

MySQL进阶之路索引失效的11种情况详析

《MySQL进阶之路索引失效的11种情况详析》:本文主要介绍MySQL查询优化中的11种常见情况,包括索引的使用和优化策略,通过这些策略,开发者可以显著提升查询性能,需要的朋友可以参考下... 目录前言图示1. 使用不等式操作符(!=, <, >)2. 使用 OR 连接多个条件3. 对索引字段进行计算操作4

ElasticSearch+Kibana通过Docker部署到Linux服务器中操作方法

《ElasticSearch+Kibana通过Docker部署到Linux服务器中操作方法》本文介绍了Elasticsearch的基本概念,包括文档和字段、索引和映射,还详细描述了如何通过Docker... 目录1、ElasticSearch概念2、ElasticSearch、Kibana和IK分词器部署

Spring排序机制之接口与注解的使用方法

《Spring排序机制之接口与注解的使用方法》本文介绍了Spring中多种排序机制,包括Ordered接口、PriorityOrdered接口、@Order注解和@Priority注解,提供了详细示例... 目录一、Spring 排序的需求场景二、Spring 中的排序机制1、Ordered 接口2、Pri

Java实现Elasticsearch查询当前索引全部数据的完整代码

《Java实现Elasticsearch查询当前索引全部数据的完整代码》:本文主要介绍如何在Java中实现查询Elasticsearch索引中指定条件下的全部数据,通过设置滚动查询参数(scrol... 目录需求背景通常情况Java 实现查询 Elasticsearch 全部数据写在最后需求背景通常情况下