注意ES的默认排序和慎用_doc排序

2024-03-12 06:20
文章标签 es 排序 默认 doc 注意 慎用

本文主要是介绍注意ES的默认排序和慎用_doc排序,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

这两天遇到了一个坑,就是ES的默认排序,对于我们有时候直接把ES当数据库来玩的时候,往往返回的结果的_score都是0, 而ES默认的排序,恰恰就是按 _score的desc。

 

那么,在全部doc的_score 都是0分的时候,分页就会错乱,有时候出现在第一页的结果很可能会重复出现在第二页,第三页 (取决于当时shards 返回的结果的顺序。

好了,有些人会觉得,为了提高性能,又不care排序的顺序的话,可能会立刻想到用_doc排序。包括我也是这么想的,那么结果告诉你,这也是会有问题的。
我们先看看_doc的描述:

 

 

也就是说,我们简单理解,_doc 其实就是按照Lucene 文件结构的当时索引时的先后顺序,那么按道理它就是最快的,可是,别忘了,ES是分布式的,也就是说,这里有很多个Lucene,这个_doc 在一个shard 里它是唯一的,可是在ES集群则不然,比如一个doc1 在shard A 上是2 ,那么它的_doc就是2, 可是有可能doc5 在shard C上也是2,因此他们两个的_doc值是一样的,也就是说还是避免不了排序上的先后,只不过这种几率会减少了很多。

其实,_doc 仅用在scroll scan下是有意义的, 因为scroll的scan 是直接按Lucene全量导,而按Lucene的文件系统先后顺序来导是最快的,在其他场景记得慎用。

 

 

关于_id与_uid

6.0版本之前和之后是不一样的。
6.0版本之前是这样子的:

那么想对不打分的文档做排序的话怎么办好呢,有人也会想到_id, 好的,_id其实是可以的,只不过,如果你想排序的话,可以考虑用 _uid去代替 _id,_id是不支持排序的,因为_id默认是not index的,而uid其实是一个 _type + _id的字符串。

6.0版本及之后是这样子的:
从6.0版本开始,_id会被建索引,也可以支持aggregate和sort了,_uid不再单独存在,而是_id的别名。
如果要按_id排序,不建议直接用_id,而是可以拷贝_id值到另一个新字段,新字段启用docvalue,这样可以节省内存使用。


转自链接,有修改:https://www.jianshu.com/p/bdf98307d984
 

 

这篇关于注意ES的默认排序和慎用_doc排序的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

nginx启动命令和默认配置文件的使用

《nginx启动命令和默认配置文件的使用》:本文主要介绍nginx启动命令和默认配置文件的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录常见命令nginx.conf配置文件location匹配规则图片服务器总结常见命令# 默认配置文件启动./nginx

PostgreSQL 默认隔离级别的设置

《PostgreSQL默认隔离级别的设置》PostgreSQL的默认事务隔离级别是读已提交,这是其事务处理系统的基础行为模式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价... 目录一 默认隔离级别概述1.1 默认设置1.2 各版本一致性二 读已提交的特性2.1 行为特征2.2

Linux中修改Apache HTTP Server(httpd)默认端口的完整指南

《Linux中修改ApacheHTTPServer(httpd)默认端口的完整指南》ApacheHTTPServer(简称httpd)是Linux系统中最常用的Web服务器之一,本文将详细介绍如何... 目录一、修改 httpd 默认端口的步骤1. 查找 httpd 配置文件路径2. 编辑配置文件3. 保存

RedisTemplate默认序列化方式显示中文乱码的解决

《RedisTemplate默认序列化方式显示中文乱码的解决》本文主要介绍了SpringDataRedis默认使用JdkSerializationRedisSerializer导致数据乱码,文中通过示... 目录1. 问题原因2. 解决方案3. 配置类示例4. 配置说明5. 使用示例6. 验证存储结果7.

C++/类与对象/默认成员函数@构造函数的用法

《C++/类与对象/默认成员函数@构造函数的用法》:本文主要介绍C++/类与对象/默认成员函数@构造函数的用法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录名词概念默认成员函数构造函数概念函数特征显示构造函数隐式构造函数总结名词概念默认构造函数:不用传参就可以

C++类和对象之默认成员函数的使用解读

《C++类和对象之默认成员函数的使用解读》:本文主要介绍C++类和对象之默认成员函数的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、默认成员函数有哪些二、各默认成员函数详解默认构造函数析构函数拷贝构造函数拷贝赋值运算符三、默认成员函数的注意事项总结一

conda安装GPU版pytorch默认却是cpu版本

《conda安装GPU版pytorch默认却是cpu版本》本文主要介绍了遇到Conda安装PyTorchGPU版本却默认安装CPU的问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的... 目录一、问题描述二、网上解决方案罗列【此节为反面方案罗列!!!】三、发现的根本原因[独家]3.1 p

Java List排序实例代码详解

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

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

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

Python多重继承慎用的地方

《Python多重继承慎用的地方》多重继承也可能导致一些问题,本文主要介绍了Python多重继承慎用的地方,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面... 目录前言多重继承要慎用Mixin模式最后前言在python中,多重继承是一种强大的功能,它允许一个