在 PostgreSQL 中构建混合搜索引擎:BM25 + 向量检索

在 PostgreSQL 中构建混合搜索引擎:BM25 + 向量检索

💡 原文英文,约300词,阅读约需1分钟。
📝

内容提要

该课程介绍如何在 PostgreSQL 内构建生产级混合搜索,无需 Elasticsearch 等外部集群。它结合关键词匹配与向量语义检索,用 RRF 在 SQL 中合并排序结果,并以 24 万篇维基百科文章为例,演示 BM25 排序、pgvector 存储 384 维嵌入、查询计划分析,以及 Python、FastAPI 和 Psycopg 后端实现。

🔎

延伸解读

混合搜索解决两类查询需求

文章指出,搜索查询通常需要两种不同的检索行为:像“Apollo 13”这样的精确查询依赖关键词匹配,而“自己发光的动物”这类概念查询则适合语义向量搜索。混合搜索同时执行两种策略,并用 RRF 在 SQL 中合并排序结果,从而兼顾精确性和语义理解。

在 PostgreSQL 内实现生产级搜索

该课程演示如何在 PostgreSQL 中构建完整的搜索流水线,无需 Elasticsearch 等外部集群。通过 pg_textsearch 扩展实现 BM25 排序,用 pgvector 和 pgvectorscale 存储 384 维嵌入,并利用 EXPLAIN (ANALYZE, BUFFERS) 分析查询计划,同时保留 ACID 保证。

全栈示例与事务性写入

教程以 24 万篇 Simple English 维基百科文章为数据集,后端使用 Python、FastAPI 和 Psycopg 连接数据库,并实现匹配高亮和单事务文档写入。这展示了如何将混合搜索集成到实际应用中,同时确保索引更新的原子性。

❓

Q&A

如何在 PostgreSQL 中实现混合搜索?

在 PostgreSQL 中实现混合搜索需要结合关键词匹配和向量语义检索。具体步骤包括:使用 pg_textsearch 扩展进行 BM25 排序,使用 pgvector 和 pgvectorscale 存储和检索向量嵌入,然后在 SQL 中使用 Reciprocal Rank Fusion (RRF) 合并两种检索的结果,形成统一的排序列表。

混合搜索相比纯关键词搜索有什么优势?

混合搜索同时执行关键词匹配和语义向量检索,既能处理精确查询(如“Apollo 13”),又能处理概念性查询(如“自己发光的动物”),从而提供更全面的搜索结果。它结合了两种检索方式的优点,提高了搜索的召回率和准确性。

BM25 在 PostgreSQL 中如何实现?

通过 pg_textsearch 扩展实现。该扩展提供了基于语料库的 BM25 排名功能,可以在 PostgreSQL 中直接对文本进行关键词匹配和排序。

向量检索在 PostgreSQL 中如何存储和查询?

使用 pgvector 和 pgvectorscale 扩展来存储和查询向量。课程中演示了存储 384 维的句子嵌入,并利用这些扩展进行高效的向量相似度搜索。

RRF 是什么,在混合搜索中起什么作用?

RRF 是 Reciprocal Rank Fusion 的缩写,是一种将多个排序结果合并为一个统一排序列表的算法。在混合搜索中,它用于在 SQL 中合并 BM25 关键词检索和向量语义检索的结果,生成最终的排名。

这个课程使用了什么数据集和示例?

课程使用包含 24 万篇 Simple English 维基百科文章的数据集作为示例,构建了一个完整的全栈搜索应用。

构建混合搜索需要哪些技术栈?

需要 PostgreSQL 数据库,以及 pg_textsearch、pgvector 和 pgvectorscale 扩展。后端使用 Python、FastAPI 和 Psycopg 进行集成,并实现匹配高亮和单事务文档写入。

🏷️

标签

➡️

继续阅读