首页/AI/RAG 与向量库速查/Elasticsearch 混合检索与 RRF

Elasticsearch 混合检索与 RRF

Elasticsearch 8.8+ 在检索 DSL 层面支持 RRF:把标准查询与 kNN 查询放进 retriever 树,服务端按排名融合;text_similarity_reranker 还可在检索后接模型重排(企业版功能)。

RAG 与向量库速查AI更新于 2026-10-13

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_candidateskNN 预筛的候选数越小越快,召回可能下降
已有 BM25 平台迁移混合检索时,RRF 改动量小、无需标定两路权重,适合作为首版;等有了标注数据再考虑加权分数融合。
融合后的排序变化要抽样人工核对:RRF 只按名次融合,若某一路本身质量差,融合结果可能被它拖低,需要按单路指标先做体检,再决定是否保留这一路。
字段与分析设置要同步改:kNN 检索依赖 dense_vector 映射与足够的索引参数,只改查询语句而跳过映射调整,请求会在执行阶段失败。

易错点

  • 未确认集群版本是否支持 retriever 语法,低版本请求直接报错
  • kNN 的 num_candidates 与 rank_window_size 未配套调整,融合候选不足
  • 只改检索 DSL 不改索引映射,向量字段未声明 dense_vector 时 kNN 无法执行
  • 融合上线后未做抽样核对,排序异常长期无人发现

数据来源与参考

  • Elasticsearch 官方文档(RRF / Retrievers / text_similarity_reranker)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌