结果震荡问题(Bouncing Results)

沫离伤花 15天前   阅读数 26 0

搜索同一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


注意:本文归作者所有,未经作者允许,不得转载

全部评论: 0

    我有话说: