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"排序的查询单独部署为一个模板,这样可以避免其他用模板进行查询时的性能损失。