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)
orderByChild() 如果值相同,如何按第二个变量排序?