PostgreSQL pgvector 在 Windows 上安装教程:从编译到第一次向量查询的完整指南
【免费下载链接】pgvectorOpen-source vector similarity search for Postgres项目地址: https://gitcode.com/GitHub_Trending/pg/pgvector
做语义搜索、以图搜图、RAG 应用时,你是不是总想再引一套独立的向量数据库?其实不必。pgvector 是 Postgres 的一个开源扩展("扩展"即给数据库加新功能的插件包),让你把向量直接存进 PostgreSQL 表里,用一行 SQL 就能做相似度搜索。本文带你走完 Windows 上从源码编译、安装到跑通第一条查询的完整流程,并覆盖最常见的报错处理和日常调优。
动手前的 5 分钟环境检查
编译类安装失败,九成是环境没配对。开始前花几分钟核对这四项,能省掉后面大量排查时间:
- PostgreSQL 13 及以上版本:pgvector 当前 0.8.6 版本支持 Postgres 13+,版本越新越推荐。记下你的安装路径(比如
C:\Program Files\PostgreSQL\18),下一步要用。 - Visual Studio 的 C++ 生成工具:只需勾选"C++ 桌面开发"工作负载,不需要完整安装 Visual Studio。它是编译 pgvector 所需的 C 编译器来源。
- Git 命令行工具:用于拉取源码。
- 管理员权限:安装步骤会往 Postgres 的 lib 目录写文件,普通权限会直接被拒。
📌 确认 Postgres 装的是 x64 版本。编译产物必须是 64 位,架构不匹配会在链接阶段报错。
编译安装三步走:PGROOT、克隆、nmake
这一步最关键的地方在于:必须使用x64 Native Tools Command Prompt(Visual Studio 附带的命令行工具),而不是普通的 CMD。它会自动把 MSVC 编译器加入 PATH,并保证编译出 64 位代码。用错窗口,后面所有报错都会绕着"找不到文件"打转。
打开管理员身份的x64 Native Tools Command Prompt for VS,按顺序执行:
第 1 步:告诉构建脚本 Postgres 在哪
这一步为什么关键?构建脚本 Makefile.win 依赖PGROOT找到 Postgres 的头文件和postgres.lib,它不会自己猜。路径写错,编译立刻在第一步失败。
set "PGROOT=C:\Program Files\PostgreSQL\18"第 2 步:拉取与安装匹配的源码
克隆到临时目录,避免污染你的代码工作区:
cd %TEMP% git clone --branch v0.8.6 https://gitcode.com/GitHub_Trending/pg/pgvector cd pgvector第 3 步:编译并安装
nmake /F Makefile.win nmake /F Makefile.win install第一条命令把 src/ 下的 HNSW、IVFFlat、向量类型等 C 源码编译成vector.dll;第二条把 dll、vector.control和 sql/ 目录下的扩展脚本复制到 Postgres 的 lib 与 share 目录。看到install阶段打印出几条 copy 记录而没有红色 error,就成功了一大半。
30 秒验证:一行 SQL 确认扩展可用
重启一次 Postgres 服务(让新 dll 生效),然后用psql连到你的数据库:
CREATE EXTENSION vector; SELECT extversion FROM pg_extension WHERE extname = 'vector';第二条查询应返回0.8.6。如果CREATE EXTENSION报could not open extension control file,通常说明上一步 install 没执行成功或 Postgres 没重启,回头检查即可。
接着建一张最小测试表,验证存取与最近邻查询:
CREATE TABLE items (id bigserial PRIMARY KEY, embedding vector(3)); INSERT INTO items (embedding) VALUES ('[1,2,3]'), ('[4,5,6]'); SELECT * FROM items ORDER BY embedding <-> '[3,1,2]' LIMIT 5;vector(3)表示 3 维单精度向量,<->是欧氏(L2)距离算子。结果里距离最小的那行排最前,说明从存储、类型到算子链路全部通了。
选对距离算子和索引类型
pgvector 提供 6 种距离算子,按场景选:
| 算子 | 含义 | 适用场景 |
|---|---|---|
<-> | L2(欧氏)距离 | 通用 |
<=> | 余弦距离 | 文本嵌入相似度 |
<#> | 负内积 | 推荐系统(返回负值,记得乘 -1 还原) |
<+> | L1(曼哈顿)距离 | 稀疏坐标 |
<~>/<%> | 海明 / 杰卡德距离 | 二进制向量(bit类型) |
注意一个容易踩的坑:<#>返回的是负内积,因为 Postgres 的索引只支持ASC方向的算子扫描。要显示真实内积就写(embedding <#> '[1,2,3]') * -1。
数据量上万后,全表精确扫描扛不住,该上近似索引了。pgvector 提供两种(实现分别在 src/hnsw.c 和 src/ivfflat.c):
HNSW(多层图索引,速度-召回权衡更好):
CREATE INDEX ON items USING hnsw (embedding vector_l2_ops);无需训练,空表就能建;代价是构建慢、占用内存多。
IVFFlat(倒排文件索引,内存占用更低):
CREATE INDEX ON items USING ivfflat (embedding vector_l2_ops) WITH (lists = 100);需要先有数据"训练"聚类中心,lists经验上取行数的平方根量级。
⚠️ 加近似索引后,同一查询的结果可能与精确搜索略有差异——它用少量召回率换速度,这是设计预期,不是 bug。
让构建和查询更快的 3 个参数
1. 构建索引时给内存
HNSW 图能放进maintenance_work_mem时构建速度显著提升,图放不下会弹出hnsw graph no longer fits的 NOTICE 提示:
SET maintenance_work_mem = '2GB';别设到耗尽服务器内存。大批量建索引还可以加并行:
SET max_parallel_maintenance_workers = 7;2. 查询时调召回率
HNSW 的搜索候选列表大小默认 40,召回不够时调大:
SET hnsw.ef_search = 100;值越大召回越好、速度越慢;只想对单条查询生效,可以在事务里用SET LOCAL。
3. 用 EXPLAIN 确认索引真的被走了
EXPLAIN (ANALYZE, BUFFERS) SELECT * FROM items ORDER BY embedding <-> '[3,1,2]' LIMIT 5;输出里出现Index Scan using ... on items才说明查询走的是索引;如果出现Seq Scan,多半是数据太少或没加ORDER BY ... LIMIT(只写WHERE embedding <-> ... < 5不加排序限制时,索引无法生效)。
常见编译报错速查:现象 → 原因 → 解决
现象:Cannot open include file: 'postgres.h'原因:PGROOT指向的目录里找不到头文件,通常是路径写错或指向了 32 位/非完整安装。 解决:核对 Postgres 安装路径后重新set "PGROOT=...",再执行nmake /F Makefile.win clean重跑编译。
现象:error C2196: case value '4' already used原因:用的是 32 位或错误的命令提示符,编译架构与 Postgres 不匹配。 解决:关闭当前窗口,改用管理员身份的x64 Native Tools Command Prompt,先nmake /F Makefile.win clean再重新编译。
现象:unresolved external symbol float_to_shortest_decimal_bufn原因:Postgres 17.0–17.2 与扩展符号不匹配。 解决:把 Postgres 升级到 17.3 或更高版本。
现象:Access is denied(安装阶段)原因:没有写 Postgres 安装目录的权限。 解决:以管理员身份重新执行nmake /F Makefile.win install。
以上细节与官方文档一致,可对照 README.md 中的 Windows 安装章节复核。
日常维护:查版本与平滑升级
升级流程很短:先用同样的方式安装新版本到 Postgres(覆盖 dll 与 sql 脚本),然后在每个需要升级的数据库里执行:
ALTER EXTENSION vector UPDATE; SELECT extversion FROM pg_extension WHERE extname = 'vector';每个小版本修了什么 bug、改了什么行为,翻一下 CHANGELOG.md 心里就有数了——比如 0.8.4 修了 HNSW vacuum 相关的图损坏问题,如果你的库在用 HNSW 索引,这类修复值得优先跟进。
日常只需盯两件事:建 HNSW 大索引时观察maintenance_work_mem是否够用(看 NOTICE 提示),以及用EXPLAIN抽查关键查询是否走了预期索引。
到这里,你的 Windows 版 PostgreSQL 已经具备了开箱即用的向量搜索能力:扩展装好了,距离算子、HNSW/IVFFlat 索引和调优参数也都过了一遍。下一步建议把真实业务向量导入,用EXPLAIN (ANALYZE, BUFFERS)实测一次查询,再按召回率需求微调hnsw.ef_search。别被"向量数据库"三个字吓到——它现在就是你手上那个 Postgres,动手试试,比想象中简单得多。
【免费下载链接】pgvectorOpen-source vector similarity search for Postgres项目地址: https://gitcode.com/GitHub_Trending/pg/pgvector
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考