ES 里的 RRF 是什么
Elasticsearch 8.8 起在检索 DSL 层面支持 RRF(排名融合):把标准查询(BM25)与 kNN 向量查询放进同一棵 retriever 树,由服务端按各自排名做倒数加权融合,不需要自己标定两路权重。rank_constant 决定名次折损的平缓程度,rank_window_size 决定每路保留多少候选参与融合;企业版还提供 text_similarity_reranker 在检索后接模型重排。
基本信息
| 版本要求 | Elasticsearch 8.8 及以上才支持 retriever 与 rrf 语法 |
|---|---|
| 融合方式 | 按名次取倒数加权求和,免标定两路权重 |
| 关键参数 | rank_constant 与 rank_window_size |
| 重排能力 | text_similarity_reranker 属企业版功能 |
典型使用场景
- 已有 BM25 平台升级:在保留原有关键词检索的基础上加一路向量检索
- 型号与术语查询:精确词命中和语义匹配同时需要,融合后覆盖更全
- 首版混合检索:不想投入标注成本标定权重时,RRF 是改动最小的起点
- 多路扩展:再增加一路查询(如标题匹配)时,融合框架可直接复用
- 检索效果巡检:对比纯 BM25 与融合后的结果差异,判断向量路是否带来增益
RRF 融合示例
RRF 融合示例
POST kb_chunks/_search
{
"retriever": {
"rrf": {
"rank_constant": 60,
"rank_window_size": 50,
"retrievers": [
{ "standard": { "query": { "match": { "content": "如何选向量库" } } } },
{ "knn": { "field": "embedding", "query_vector": [], "k": 50, "num_candidates": 200 } }
]
}
},
"size": 10
}
# retriever 语法在 8.8 之前不可用,低版本会直接返回解析错误
参数与作用
| 参数 | 作用 | 调整后的影响 |
|---|---|---|
| rank_constant | 名次折算的常数 | 越大则高位名次的优势越平缓 |
| rank_window_size | 每路保留的候选数 | 过小会让融合阶段缺少可用候选 |
| knn 的 k | 向量查询返回的邻居数 | 与窗口不配套时候选不足 |
| num_candidates | kNN 预筛的候选数 | 越小越快,召回可能下降 |
已有 BM25 平台迁移混合检索时,RRF 改动量小、无需标定两路权重,适合作为首版;等有了标注数据再考虑加权分数融合。
融合后的排序变化要抽样人工核对:RRF 只按名次融合,若某一路本身质量差,融合结果可能被它拖低,需要按单路指标先做体检,再决定是否保留这一路。
字段与分析设置要同步改:kNN 检索依赖 dense_vector 映射与足够的索引参数,只改查询语句而跳过映射调整,请求会在执行阶段失败。