第六阶段 53 · kNN 向量检索与语义搜索(dense_vector + knn)
53 · kNN 向量检索与语义搜索dense_vector knn阶段第六阶段 / 进阶专题ES 8.x 旗舰能力ESdense_vectorknn查询、混合检索BM25 向量 | PostgreSQLpgvector的-/最近邻1. 概念从“关键词匹配”到“语义相似”前面所有查询match/term…都是关键词/词项匹配——字面对不上就搜不到搜“笔记本”匹配不到只写“notebook”的文档。向量检索换了个思路把文本用embedding 模型转成一个高维向量如 768 维浮点数组语义相近的文本向量也相近。查询时把问题也转成向量找距离最近的 K 个文档kNN k-Nearest Neighbors。于是“笔记本”能召回“notebook / 便携电脑 / ThinkPad”——按语义而非字面。ES 8.x 用dense_vector字段 HNSW 图索引原生支持近似 kNNANN性能可用于生产。向量不是取代关键词检索而是互补关键词精准、向量懂语义生产常做混合检索见第 5 节。2. PostgreSQL 对照-- pgvector存向量 最近邻检索CREATETABLEdocs(idint,embedding vector(768));CREATEINDEXONdocsUSINGhnsw(embedding vector_cosine_ops);-- 找和查询向量最相似的 10 条 是余弦距离SELECTidFROMdocsORDERBYembedding:query_vecLIMIT10;ES 的dense_vectorknn≈pgvector的vector列 HNSW 索引 排序。3. ES DSL3.1 mapping定义向量字段PUT docs_idx { mappings: { properties: { title: { type: text }, content: { type: text }, embedding: { type: dense_vector, dims: 768, // 与你的 embedding 模型维度一致 index: true, // 建 HNSW 索引支持快速 ANN similarity: cosine // cosine / dot_product / l2_norm } } } }3.2 写入向量由模型离线/写入时算好POST docs_idx/_doc { title: ThinkPad X1, content: 轻薄商务本, embedding: [0.021, -0.114, 0.337, ... ] } // 768 个浮点3.3 kNN 查询找语义最近的 K 条POST docs_idx/_search { knn: { field: embedding, query_vector: [0.02, -0.10, 0.31, ...], // 查询文本的向量 k: 10, // 返回最近 10 条 num_candidates: 100 // 每分片先取 100 候选再精排越大越准越慢 }, _source: [title, content] }3.4 带过滤的 kNN先过滤再找近邻POST docs_idx/_search { knn: { field: embedding, query_vector: [ ... ], k: 10, num_candidates: 100, filter: { term: { category: laptop } } // 只在该类目里找近邻 } }4. Spring Boot 实现ComponentpublicclassDoc53KnnSearch{AutowiredprivateElasticsearchClientelasticsearchClient;/** * 语义检索传入“查询文本的向量”返回最相似的 topK 篇。 * 注意queryVector 由你的 embedding 模型本地模型 / OpenAI / 自建服务先算好。 */publicListMapString,ObjectsemanticSearch(StringindexName,ListFloatqueryVector,inttopK)throwsIOException{SearchResponseMaprespelasticsearchClient.search(s-s.index(indexName).knn(k-k.field(embedding).queryVector(queryVector).k(topK).numCandidates(Math.max(topK*10,100)))// 候选数经验值.source(src-src.filter(f-f.includes(title,content))),Map.class);returnresp.hits().hits().stream().map(Hit::source).filter(Objects::nonNull).collect(Collectors.toList());}}knn是SearchRequest上的一等参数与query平级。每条命中的相似度分在hit.score()similarity 越高分越高。向量怎么来ES 本身不算 embedding除非用 ELSER/推理管道一般在应用侧调模型把文本转向量再写入/查询。5. 混合检索BM25 关键词 向量语义生产推荐单靠向量可能漏掉精确词如型号X1-2026单靠关键词又不懂同义词。生产上把两者结果融合兼得“精准 语义”。ES 提供两种方式5.1 knn 与 query 同时给分数相加POST docs_idx/_search { query: { match: { content: 轻薄 笔记本 } }, // BM25 关键词 knn: { // 向量语义 field: embedding, query_vector: [ ... ], k: 10, num_candidates: 100, boost: 0.5 } }5.2 RRFReciprocal Rank Fusion按排名融合更稳POST docs_idx/_search { retriever: { rrf: { retrievers: [ { standard: { query: { match: { content: 轻薄 笔记本 } } } }, { knn: { field: embedding, query_vector: [ ... ], k: 20, num_candidates: 100 } } ], rank_window_size: 50 } } }RRF 不依赖两路分数的绝对量纲只看各自排名融合更稳是当前混合检索的推荐做法。6. 坑与最佳实践dims必须与模型一致写入向量维度和 mappingdims不符会报错换模型通常要 reindex。similarity要匹配模型多数句向量模型用cosine用点积模型选dot_product需归一化。num_candidates调准确率越大越接近精确 kNN 但越慢经验k的 10 倍起步按召回率调。向量很占空间和内存HNSW 图常驻内存维度高/文档多时评估资源必要时降维或用量化int8/bbq。ES 不负责生成向量除非用 ELSER 稀疏向量或 inference 管道文本→向量在应用侧或推理服务做。过滤用knn.filter先缩小范围再找近邻比查完再过滤更准更快。生产优先混合检索 RRF纯向量易漏精确词纯关键词不懂语义融合最稳。ELSER稀疏向量是另一条路Elastic 自带模型无需自备 embedding适合英文语义检索可作对比方案。相关关键词全文匹配对比基线10-match-全文匹配.md相关性打分与 boosting41-相关性调优.md字段裁剪减小向量返回开销19-source-字段裁剪.md全系列完结至此学习计划覆盖了 ES 的两大检索范式关键词/BM2510–19与向量/语义本篇外加聚合、写入、索引管理、深分页、运维、关系建模、并发控制。

相关新闻

AI 用了哪些资料,回答了什么,能不能事后查清楚?

AI 用了哪些资料,回答了什么,能不能事后查清楚?

很多团队刚开始使用AI时,关注点通常在效果上。能不能总结文档,能不能回答客户问题,能不能生成代码。只要结果看起来顺畅,项目就容易被认为已经跑通。 但AI真正进入日常工作后,另一个问题会慢慢出现:它到底用…

2026/9/30 16:06:02 阅读更多 →
Unity WebGL移动端自动全屏横屏解决方案:混合架构与工程实践

Unity WebGL移动端自动全屏横屏解决方案:混合架构与工程实践

1. 项目概述:一个被低估的“小”需求如果你做过Unity WebGL项目,并且希望它在手机浏览器里能自动横屏、甚至自动全屏播放,那你大概率经历过和我一样的抓狂时刻。这听起来像是一个简单的功能,不就是把屏幕转一下、铺满吗&#xff1…

2026/10/8 11:36:05 阅读更多 →
大模型翻译质量周报W32:deepseek-v4-pro以9分综合领跑

大模型翻译质量周报W32:deepseek-v4-pro以9分综合领跑

本周 423 篇翻译任务,由 3 个模型完成。抽样 2 篇进行多模型盲评对比,综合最佳:deepseek-v4-pro(均分 9/10)。 本周翻译统计模型语言翻译量平均耗时平均质量评分deepseek-v4-flashen7120.9s未评claude-sonnet-4.6ja211…

2026/10/5 14:22:20 阅读更多 →

最新新闻

杨幂×Prada:顶奢代言背后的选人逻辑与商业价值拆解

杨幂×Prada:顶奢代言背后的选人逻辑与商业价值拆解

关于杨幂成为Prada代言人这件事,圈内讨论热度一直没停过。不管是时装周前排看秀的镜头,还是广告大片释放出的状态,都让“顶奢代言”这个概念在当下的内娱市场里有了更具体的参照物。借着这个热点,我想认真聊聊这背后的逻辑&#x…

2026/10/10 5:46:40 阅读更多 →
Unison 语言中 Term 声明禁止携带哈希限定名:语法规则、解析器实现与转写测试验证

Unison 语言中 Term 声明禁止携带哈希限定名:语法规则、解析器实现与转写测试验证

编程语言编译器语言运行时开发工具 【免费下载链接】unison A friendly programming language from the future 项目地址: https://gitcode.com/gh_mirrors/un/unison 点击查看 免费下载 本文以 Unison 开源仓库中的转写(transcript)测试文档…

2026/10/10 5:46:40 阅读更多 →
PCA9422+STM32F405RG电源管理实战:寄存器配置与调试全解析

PCA9422+STM32F405RG电源管理实战:寄存器配置与调试全解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 5:46:40 阅读更多 →
有效信息是博文生成的核心要素

有效信息是博文生成的核心要素

您提供的信息中没有有效的项目标题(当前显示为“无标题”),且相关热搜词和网络搜索内容均为空白。缺少核心输入,我无法生成围绕具体主题、场景和关键词展开的高质量原创博文。《无标题》不是一个可执行的项目主题,强行…

2026/10/10 5:46:40 阅读更多 →
colorlog 6.10.1 使用指南:为 Python 标准库 logging 接入 ANSI 彩色终端输出

colorlog 6.10.1 使用指南:为 Python 标准库 logging 接入 ANSI 彩色终端输出

【免费下载链接】context-hub 项目地址: https://gitcode.com/gh_mirrors/co/context-hub 点击查看 免费下载 导读 colorlog 是一个轻量的 Python 第三方库,它的作用是为 Python 标准库 logging 的处理器(handler)增加 ANSI 颜色…

2026/10/10 5:46:40 阅读更多 →
缩短招聘周期:从人才画像到Offer的11个高效策略

缩短招聘周期:从人才画像到Offer的11个高效策略

招聘周期拉长,用人部门催、候选人等不起、HR夹在中间两头受气——这是过去几年我在各类企业里反复看到的真实场面。尤其遇到急招岗位,从职位发布到人选入职动辄拖上三四十天,错过业务窗口不说,还经常出现“谈好的Offer被对手截胡”…

2026/10/10 5:45:40 阅读更多 →

日新闻

卫星轨道分类全解析:从LEO到GEO的选型逻辑与工程实践

卫星轨道分类全解析:从LEO到GEO的选型逻辑与工程实践

1. 从“卫星轨道分类”这个标题说起:为什么值得花时间搞懂第一次接触“卫星轨道分类”这个概念,很多人会觉得它离自己很远——不就是天上的星星怎么转吗?但如果你正在做航天任务规划、遥感数据接收、星座设计,甚至只是准备一场航天…

2026/10/10 0:00:39 阅读更多 →
Spring AOP 核心原理与实战:从概念到日志切面落地

Spring AOP 核心原理与实战:从概念到日志切面落地

1. 从一个真实痛点说起:为什么你的代码里到处都是重复逻辑刚入行那会儿,我写过一个用户管理模块,注册、登录、改密码、注销四个接口。每个接口里都塞了几乎一样的日志打印、参数校验、事务开启和提交。当时觉得没什么,能跑就行。直…

2026/10/10 0:00:40 阅读更多 →
Python招聘数据采集与分析可视化:从采集清洗到薪资技能城市可视化全链路

Python招聘数据采集与分析可视化:从采集清洗到薪资技能城市可视化全链路

简介:这是一套面向计算机相关专业学生与项目实战学习者的Python数据采集与分析可视化完整项目,以Boss直聘岗位数据为对象,适合用作毕业设计、课程设计或期末大作业。资源包共38个文件,约246KB,以13个py源码文件为核心&…

2026/10/10 0:00:40 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 15:26:32 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 1:36:08 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 10:11:06 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 5:23:50 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 21:32:20 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 6:17:20 阅读更多 →