ES排序值相同顺序随机的问题

Posted gaoze

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ES排序值相同顺序随机的问题相关的知识,希望对你有一定的参考价值。

 

ES排序值相同顺序随机的问题

问题描述

ES按某一列排序,当值相同出现的先后顺序随机,所以导致前端页面显示看起来怪怪的,每次排序都不一样用户会认为错误。

解决方式

这个玩意是因为ES查询时每个分片单独查询最后再归并,归并时是随机的,所以结果是随机的。
解决方式参考:https://stackoverflow.com/questions/54712994/how-are-the-documents-ordered-in-elasticsearch-if-the-sort-value-for-two-documen
通过一个额外的列进行排序保证2列加起来不会出现相同的值用以解决这个问题。但是对于这个额外的列的选择,依旧有着一定的考量。

_doc字段的问题

_doc是es索引中自带的id,是个整形,所以用它排序是最方便也性能最高的,但是ES的机制决定着每个分片都会有自己的索引,也就是说不同分片内的不同文档可能有相同的_doc,所以用_doc排序还是可能会出现随机的问题。例如10个分片的index中,只按_id排序会出现10个_doc为0的文档。

使用_id排序解决

那么_id就是唯一选择了,它是一个唯一属性可以保证每个文档不一样。

隐患

由于我们使用模板查询,所以加上一条按‘_id‘查询之后会导致每次查询都带着这个排序条件,会导致性能下降。

分离模板解决此隐患

为了避免性能遭受损失,应当将需要按"_id"排序的查询单独部署为一个模板,这样可以避免其他用模板进行查询时的性能损失。

 

以上是关于ES排序值相同顺序随机的问题的主要内容,如果未能解决你的问题,请参考以下文章

linux 中 random() 函数相同的值(同时 grof ing)

Amazon Redshift 按特定值排序

orderByChild() 如果值相同,如何按第二个变量排序?

ES6 - Object.is()

sql中order by 待排序的字段值相同时,发生分页出现重复数据的问题

sql中order by 待排序的字段值相同时,发生分页出现重复数据的问题