在混合检索的过程中,文本检索与向量检索的评分机制大不相同,RRF(Reciprocal Rank Fusion)融合搜索的基本思想是对每个系统的排名结果赋予一个权重,这个权重是其排名的倒数。具体来说,对于每个系统的排名列表中的每个项目,RRF 算法会计算一个分数,该分数是该项目在每个列表中排名的倒数之和。然后,所有项目根据这个分数进行重新排序,以生成最终的融合排名列表。RRF 内置于ES 中,无需外部模型服务,较为轻量,可作为粗排环节的融合排序算法之一。
写法一:retriever 方式(Elastic 8.16正式发布)
GET book-index/_search{"retriever": {"rrf": {"retrievers": [{"retriever": {"knn": {"field": "title_vector","query_vector": [0.1, 0.2, 0.3 ...],"k": 10,"num_candidates": 100}},"weight": 0.8},{"retriever": {"standard": {"query": {"match": {"title_text": "人类"}}}},"weight": 0.2}],"rank_window_size": 50,"rank_constant": 20}}}
写法二:传统写法(此方式已弃用,不推荐)
GET book-index/_search{"knn":{"field":"content_vector","query_vector": [0.5, 0.6, 0.7 ...],"k":10,"num_candidates": 100},"query":{"match":{"title_text":{"query":"人类"}}},"rank":{"rrf":{"rank_window_size":50,"rank_constant":20}},"size": 10}
参数说明:
rank_window_size:从每个查询中取多少结果参与融合,默认值100
rank_constant:控制排名的常数,值越小排名影响越大,默认值60
RRF的计算公式如下:
