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

相关文章

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 全部数据写在最后需求背景通常情况下

Pandas中多重索引技巧的实现

《Pandas中多重索引技巧的实现》Pandas中的多重索引功能强大,适用于处理多维数据,本文就来介绍一下多重索引技巧,具有一定的参考价值,感兴趣的可以了解一下... 目录1.多重索引概述2.多重索引的基本操作2.1 选择和切片多重索引2.2 交换层级与重设索引3.多重索引的高级操作3.1 多重索引的分组聚

大数据小内存排序问题如何巧妙解决

《大数据小内存排序问题如何巧妙解决》文章介绍了大数据小内存排序的三种方法:数据库排序、分治法和位图法,数据库排序简单但速度慢,对设备要求高;分治法高效但实现复杂;位图法可读性差,但存储空间受限... 目录三种方法:方法概要数据库排序(http://www.chinasem.cn对数据库设备要求较高)分治法(常

Java操作ElasticSearch的实例详解

《Java操作ElasticSearch的实例详解》Elasticsearch是一个分布式的搜索和分析引擎,广泛用于全文搜索、日志分析等场景,本文将介绍如何在Java应用中使用Elastics... 目录简介环境准备1. 安装 Elasticsearch2. 添加依赖连接 Elasticsearch1. 创

Python中lambda排序的六种方法

《Python中lambda排序的六种方法》本文主要介绍了Python中使用lambda函数进行排序的六种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们... 目录1.对单个变量进行排序2. 对多个变量进行排序3. 降序排列4. 单独降序1.对单个变量进行排序

oracle数据库索引失效的问题及解决

《oracle数据库索引失效的问题及解决》本文总结了在Oracle数据库中索引失效的一些常见场景,包括使用isnull、isnotnull、!=、、、函数处理、like前置%查询以及范围索引和等值索引... 目录oracle数据库索引失效问题场景环境索引失效情况及验证结论一结论二结论三结论四结论五总结ora

关于Java内存访问重排序的研究

《关于Java内存访问重排序的研究》文章主要介绍了重排序现象及其在多线程编程中的影响,包括内存可见性问题和Java内存模型中对重排序的规则... 目录什么是重排序重排序图解重排序实验as-if-serial语义内存访问重排序与内存可见性内存访问重排序与Java内存模型重排序示意表内存屏障内存屏障示意表Int

Python中列表的高级索引技巧分享

《Python中列表的高级索引技巧分享》列表是Python中最常用的数据结构之一,它允许你存储多个元素,并且可以通过索引来访问这些元素,本文将带你深入了解Python列表的高级索引技巧,希望对... 目录1.基本索引2.切片3.负数索引切片4.步长5.多维列表6.列表解析7.切片赋值8.删除元素9.反转列表