pgvector:给 PostgreSQL 加上向量相似度检索——后端开发者的最短路径

📅 发布时间:2026/9/5 15:29:43
pgvector:给 PostgreSQL 加上向量相似度检索——后端开发者的最短路径
pgvector给 PostgreSQL 加上向量相似度检索——后端开发者的最短路径【免费下载链接】pgvectorOpen-source vector similarity search for Postgres项目地址: https://gitcode.com/GitHub_Trending/pg/pgvector你在做语义搜索。用户输入查询你要返回最相关的 Top N 篇文档。现状是应用层逐条算距离30 万行的表一次查询要跑好几秒。pgvector 把这件事搬进 PostgreSQL它是以 PostgreSQL 扩展形式提供的开源向量检索方案让向量成为一等数据类型存储、距离计算、最近邻查找在一条 SQL 里完成顺带复用 ACID 事务和 JOIN。本文面向已有 PostgreSQL、想让向量检索最短时间跑起来的后端开发者只讲最短路径不讲用不上的功能。装之前先定三件事它们决定后续路径动手前有三个决策直接影响后面的步骤选错了会返工决策点可选影响操作系统Linux/macOS 或 Windows前者用make走 PGXS后者用nmake且必须装 Visual Studio 的 C 工具链PostgreSQL 版本13 及以上低于 13 根本编译不过这是硬门槛索引时机建表即建索引还是先裸跑HNSW 允许空表建图IVFFlat 必须先有数据做聚类训练还有一个常被忽略的硬约束——维度上限vector类型最多 2000 维halfvec半精度4000 维bit二进制64000 维sparsevec最多 1000 个非零元素。选型看你的嵌入模型输出维度常见的 768、1536 维用vector即可先不用考虑精度压缩。最短路径克隆、编译、安装、启用主线就四步拿源码 → 编译 → 装进 PostgreSQL 的目录 → 启用扩展。克隆源码锁版本 tag这段拉取的是固定版本 tag 而不是 master 分支保证装到的是已经过验证的版本cd /tmp git clone --branch v0.8.6 https://gitcode.com/GitHub_Trending/pg/pgvector.git cd pgvector编译两条路线报错大多出在这一步Linux/macOS 一条make就够。它通过 PGXS 机制调用你本机 PostgreSQL 的pg_config按你装的那个版本编译——这也回答了为什么必须先装 PostgreSQL 再装 pgvectormakeWindows 走另一条路。先用管理员身份打开 x64 Native Tools Command Prompt for VS把 PGROOT 指到 PostgreSQL 安装目录再用项目自带的 Makefile.win 编译。这一步最容易卡住报找不到 postgres.h时九成是 PGROOT 没设置或指错了大版本目录set PGROOTC:\Program Files\PostgreSQL\18 nmake /F Makefile.win nmake /F Makefile.win install安装并启用扩展make install把 vector 的共享库和 SQL 脚本拷贝到 PostgreSQL 的 lib 与 extension 目录Linux 下可能需要 sudoWindows 路线上面已合并执行。扩展按数据库启用哪个库要做向量检索就去哪个库执行一次CREATE EXTENSION vector;最小验证闭环一条 SQL 判断装没装好验证标准很具体建一张 3 维向量表插 2 行按 L2 距离取最近邻顺序必须对——[1,2,3]应排在[4,5,6]前面因为它到查询向量[3,1,2]的距离约为 2.45而后者约为 5.74。先建表并灌入两行数据CREATE TABLE items (id bigserial PRIMARY KEY, embedding vector(3)); INSERT INTO items (embedding) VALUES ([1,2,3]), ([4,5,6]);再执行带距离列的检索把数字露出来方便肉眼核对SELECT id, embedding, embedding - [3,1,2] AS distance FROM items ORDER BY embedding - [3,1,2] LIMIT 5;看到 2 行结果、首行 id 为 1、distance 约 2.45就说明向量检索已可用。除 L2 距离-外它还提供内积#、余弦距离、L1 距离二进制向量另有 Hamming 和 Jaccard 距离可按业务选一种。进阶分叉HNSW 与 IVFFlat 怎么选前面是顺序扫描的精确检索召回 100%代价是耗时随行数线性增长。我的判断10 万行以内先别建索引把延迟曲线跑出来再说超过 10 万行、延迟开始抬头再上近似检索——用少量召回换数量级的速度。pgvector 给两个索引类型特性几乎相反按场景二选一生产默认选 HNSW这里选 HNSW 而非 IVFFlat 作为默认因为它的速度-召回平衡更好而且空表就能建图——适合先建索引、后灌数据的上线节奏。建索引时按你要用的距离函数选对应的 opsCREATE INDEX ON items USING hnsw (embedding vector_l2_ops);两个调参旋钮值得记住查询期SET hnsw.ef_search 100可在默认 40 的基础上提召回、降速度构建期把图放进内存SET maintenance_work_mem 8GB能显著加速内存不够时 pgvector 会主动发 NOTICE 提示你。更多参数细节可翻 README.md 的 HNSW 小节。存量大数据走 IVFFlatIVFFlat 用 k-means 把向量聚成若干列表构建快、内存省但必须先有数据训练。如果你面对的是一张已经存了几百万行的老表选它更合适。lists有口诀百万行以下取rows / 1000百万行以上取sqrt(rows)CREATE INDEX ON items USING ivfflat (embedding vector_l2_ops) WITH (lists 100);查询期用ivfflat.probes控制探查多少列表从sqrt(lists)起步调。两点提醒近似索引建好后同一条查询的结果可能和之前不同这是近似最近邻的正常表现不是 bug建索引永远放在初始数据加载完之后做比边插边建快得多。回到搜索场景把应用层距离计算删掉现在可以回答开篇的问题了找最相似 Top 5 文档就是一条SELECT ... ORDER BY embedding [...] LIMIT 5因为检索发生在库里你可以顺手 JOIN 业务表、按权限加 WHERE 过滤这些在专用向量数据库里都要绕弯实现。下一步清单① 用-或排序查询替换应用层的逐条距离计算内存里的那套向量加载直接删掉② 表不满 10 万行先裸跑观察精确检索的延迟③ 超过 10 万行加 HNSW再用EXPLAIN (ANALYZE, BUFFERS)确认索引真正被命中④ 维度超过 2000 或内存吃紧时再考虑切halfvec把存储和带宽砍半。【免费下载链接】pgvectorOpen-source vector similarity search for Postgres项目地址: https://gitcode.com/GitHub_Trending/pg/pgvector创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考