当前位置: 首页 > news >正文

Elasticsearch 混合检索一句 `retriever.rrf`,把语义召回与关键词召回融合到极致

1. 为什么要混合检索

  • 全文检索(Lexical)
    BM25 基于词频 & 逆文档频率,适合 代码、SKU、专用名词 等需要精确匹配的场景。

  • 语义检索(Semantic)
    稀疏/稠密向量捕捉上下文与同义词,能理解 自然语言问题,召回“不含关键词但含同义含义”的文档。

痛点:只用其中一种都容易漏召回或误召回;混合检索(Hybrid)把两种结果 加权融合,既保留精确命中,又能补充语义相关。

2. 先决条件与模型

组件版本建议作用
Elasticsearch≥ 8.11内置 semantic_text 字段 & RRF
ELSER v2Inference API默认稀疏向量模型,零样本即用
Kibana同版本Data Visualizer 上传 TSV

Serverless / Cloud 已默认带 Inference Endpoint;自托管需先 POST _ml/inference/<model_id>

3. 创建“双通道”Mapping

PUT /semantic-embeddings
{"mappings": {"properties": {"semantic_text": {           # 语义向量通道"type": "semantic_text"},"content": {                 # 原文关键词通道"type": "text","copy_to": "semantic_text" # 自动送进向量流水线}}}
}
  • semantic_text 字段写入即异步调用 Inference 生成 稀疏向量
  • copy_to 可保留原文供 BM25,也让模型见到完整上下文

4. 数据落盘:上传 MS MARCO 子集

  1. 下载 msmarco-passagetest2019-top1000.tsv
  2. Kibana ➜ Machine Learning ➜ Data Visualizer
  3. Override settings:第一列 id,第二列 content
  4. Import 为 test-data(≈ 18 万行)

5. reindex 批量补嵌入

POST /_reindex?wait_for_completion=false
{"source": {"index": "test-data","size" : 500                # 小 batch 快速观察},"dest": { "index": "semantic-embeddings" }
}
  • 拿到 task_id,可 GET _tasks/<id> 实时看进度
  • 数据量大可先小批量测试,确认 OK 再全量

提示:老索引若已在生产,可零停机开一个临时别名,用 reindex + alias swap 平滑切换。


6. Query DSL:RRF 融合

GET /semantic-embeddings/_search
{"retriever": {"rrf": {"retrievers": [{                   # 1⃣ 关键词 BM25"standard": {"query": {"match": {"content": "How to avoid muscle soreness while running?"}}}},{                   # 2⃣ 语义稀疏向量"standard": {"query": {"semantic": {"field": "semantic_text","query": "How to avoid muscle soreness while running?"}}}}],"rank_constant": 60   # 可选,默认 60,调大则更强调高位文档}},"size": 10                # 返回融合后前 10
}

返回字段亮点

"_score": 0.0328,     // RRF 加权得分
"_rank" : 1,          // 融合后排名
"semantic_text.inference.embeddings": { … } // 稀疏向量局部

7. ES|QL 写法简例

FROM semantic-embeddings
| RETRIEVE RRF(STANDARD(match(content, "muscle soreness running")),STANDARD(semantic(semantic_text, "muscle soreness running")))
| LIMIT 10

ES|QL 的 RETRIEVE RRF() 语法目前仍在 8.x 试验标志下,若未开启可继续用 DSL。

8. 常见坑 & 调优

问题解决方案
语义结果不佳确认写入是否触发 Inference;ELSER 支持 ml.inference_id 显式指定
rank_constant 怎么调?一般 10–100 之间实验:
• 调大 ➜ 关键词靠前
• 调小 ➜ 语义影响更大
条目多但 _score 很低属 RRF 正常特性,可忽略,但排序仍正确
reindex 太慢利用 pipeline + max_docs 分段;或先临时 alias 新写旧读,后台慢迁移

9. 小结

混合搜索流程三步走:

  1. 双字段索引 —— content 做 BM25,semantic_text 存稀疏向量
  2. 批量重建嵌入 —— 用 reindex 触发 Inference Pipeline
  3. RRF 融合查询 —— retriever.rrf 同时喂 BM25 与语义查询

这样即可在 Elastic Stack 中零依赖外部向量库,享受 “含义 + 关键词” 一拍即合的搜索体验。试试把你公司的 FAQ、文档、产品描述喂给它,你会惊喜发现搜索结果瞬间「既准又全」!

http://www.dtcms.com/a/311478.html

相关文章:

  • 模拟激光相机工作站版本6.0 5.2.32 6.0.44 6.031 5.2.20
  • 题解:P4447 [AHOI2018初中组] 分组
  • 归并排序(简单讲解)
  • [论文阅读] 人工智能 + 软件工程 | GitHub Marketplace中CI Actions的功能冗余与演化规律研究
  • 【RK3568 看门狗驱动开发详解】
  • Kubernetes Gateway API 详解:现代流量路由管理方案
  • 【最后203篇系列】030 强化学习探索
  • 浏览器及java读取ros1的topic
  • 重生之我在暑假学习微服务第八天《OpenFeign篇》
  • 暑期算法训练.13
  • cv弹窗,退款确认弹窗
  • 数据结构(12)二叉树
  • 深入 Go 底层原理(六):垃圾回收(GC)
  • 数据资产是什么?
  • MySQL 内置函数
  • npm安装下载慢问题
  • 离线安装docker和docker-compose
  • 【人工智能agent】--服务器部署PaddleX 的 印章文本识别模型
  • JVM 调优中JVM的参数如何起到调优动作?具体案例,G1GC垃圾收集器参数调整建议
  • Junit5+Maven+RestAssured+Allure接口自动化框架
  • VScode对Ubuntu用root账号进行SSH远程连接开发
  • MSQL-聚簇索引与非聚簇索引的比较
  • k8s的pod的YAML问题
  • 公共卫生场景下漏检率↓76%:陌讯动态特征融合算法在口罩识别中的实战解析
  • 7月销售超5万辆,零跑汽车再创单月历史新高
  • 开源列式分布式数据库clickhouse
  • SpringBoot 启动富文本文字更改
  • .NET 中,Process.Responding 属性用于检查进程的用户界面是否正在响应
  • Linux性能监控与调优全攻略
  • SpringCloud微服务