在 Elasticsearch 中,获取一致的评分是一个重要的问题,尤其是在涉及分片和副本的情况下。以下是关于如何实现一致评分的详细说明:
1.分数不可复现的原因
Elasticsearch 使用分片和副本机制来提高性能和可用性,但这也带来了评分不一致的问题。当用户运行相同的查询时,可能会命中不同的分片副本,而这些副本的索引统计信息可能因已删除文档的存在而不同。例如,主分片可能刚刚完成了一次大规模的段合并,移除了大量已删除的文档,而副本中仍保留这些文档,导致索引统计信息不同,进而影响评分。
2.解决方案
(1)使用偏好设置(Preference)
为了避免因分片副本不同而导致的评分不一致,可以为查询设置偏好(preference)。偏好可以通过用户 ID 或会话 ID 来指定,确保同一个用户的查询总是命中相同的分片。这样可以保持评分的一致性。
(2)解决文档排序不一致
当两个文档的评分相同时,Elasticsearch 默认会根据内部 Lucene 文档 ID 进行排序,而这些 ID 在不同副本中可能不同。通过始终命中相同的分片,可以确保文档排序的一致性。
3.相关性评分问题
如果查询结果的相关性看起来不正确(例如,内容相同的文档评分不同,或者精确匹配没有排在第一位),这可能是由于分片的索引统计信息不一致导致的。
(1)单分片索引
对于数据量较小的索引,可以将索引设置为单分片(`index.number_of_shards: 1`)。这样,所有文档的索引统计信息将完全一致,从而