结果震荡问题(Bouncing Results)

余生颓废 提交于 2020-08-17 07:50:13

搜索同一query,结果ES返回的顺序却不尽相同,这就是请求轮询到不同分片,而未设置排序条件,相同相关性评分情况下,是按照所在segment中lucene ID来排序的,相同数据的不同副本之间该ID是不能保证一致的,由于搜索请求是在所有有效的分片副本间轮询的,这两个document可能在原始分片里查询出来是一种顺序,在副本分片里查询出来是另一种顺序。故造成结果震荡问题。

可以使用preference参数(_primary_first、_replica_first等)来指定分片查询的优先级,即我们可以通过该参数来控制搜索时的索引数据分片。

如不设置该参数:在所有有效的主分片以及副本间轮询。

1. 段合并以及删除已经删除的文档的结果在节点之间并不协同,意味着主分片和副本分片中被删的文档数目可能不同。意思是说当索引有update/delete一类操作的时候,旧文档不是马上被删除的,实际的删除操作发生在一些segment合并的阶段。 而主副分片的segment合并完全是各不想干独立进行的,所以还未删除的旧文档是不一致的。 而出于一些实际因素的考虑,还未物理删除的文档,也是shard统计信息的一部分,这样就会导致主副分片可能存在打分score的差异。

2. 就是搜索的结果里,可能有写文档的score是一样的,对于score一样的匹配文档,ES是按照lucene ID(lucene ID是lucene层面的一个根据文档写入顺序递增的一个顺序id,是lucene内部用来寻址文档位置的一个id)顺序返回。 同一个文档写入主副分片的doc ID并不是完全一致的,当要求返回TOP N的文档时,就可能存在主副分片给的结果不一致。

3. 因为主副分片的refresh过程是相互独立的,在有持续写入的情况下,主副分片包含的数据不是严格一致的。 所以同个搜索多次执行的时候,在主副分片来回执行会导致结果“跳动”的情况。

见https://www.elastic.co/guide/en/elasticsearch/reference/current/consistent-scoring.html

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!