倒数排序融合 Reciprocal Rank Fusion(RRF)
倒数排序融合 (RRF) 是一种算法,用于评估多个先前排名结果的搜索分数,以生成统一的结果集。它是一种将具有不同相关性指标的多个结果集组合成单个结果集的方法。 RRF 不需要调整,不同的相关性指标不必相互关联即可获得高质量的结果。该技术由滑铁卢大学(加拿大)和谷歌合作开发,根据其作者的说法,「产生的结果比任何单个系统更好,也比标准重新排名方法更好」。
RRF 流程
RRF 的基本原则是,在不同搜索策略中始终出现在顶部位置的文档可能更相关,因此应该在合并结果中获得更高的排名。
以下是 RRF 流程的简化分解:
- 从多个同时查询收集排名搜索结果。
- 为排名列表中的每个结果分配倒数排名分数。 RRF 的过程为每个结果集中的每个匹配项生成一个新的搜索分数。对于搜索结果中的每个文档,算法根据其在列表中的位置分配一个倒数排名分数。该分数的计算方式为 1/(rank + k),其中「rank」是文档在列表中的位置,「k」是一个常数。经验观察表明,当设置为较小值(例如 60)时,「k」表现最佳。请注意,此「k」值是 RRF 算法中的常数,与调节最近邻居数量的「k」完全不同。
- 合并分数。该算法将从每个文档的每个搜索策略获得的倒数排名分数相加,从而生成每个文档的组合分数。
- 该算法根据组合分数对文档进行排名并进行相应的排列。结果列表构成融合排名。
可以使用流程图描述倒数排名融合 (RRF) 过程:

图 1:倒数排名融合 (RRF) 流程图。该图说明了 RRF 排名过程中涉及的步骤。
实现 RRF
RRF 使用以下公式来确定每个文档的排名分数:
score = 0.0
for q in queries:
if d in result(q):
score += 1.0 / ( k + rank( result(q), d ) )
return score
# where
# k is a ranking constant
# q is a query in the set of queries
# d is a document in the result set of q
# result(q) is the result set of q
# rank( result(q), d ) is d's rank within the result(q) starting from 1
(代码来自 Elasticsearch 文档)
参考来源
【1】https://safjan.com/implementing-rank-fusion-in-python/
【2】https://www.elastic.co/guide/en/elasticsearch/reference/current/rrf.html