PostgreSQL 向量相似度搜索部署指南:pgvector 在 Windows 上 3 阶段编译安装与验证
2026/9/6 17:25:12 网站建设 项目流程

PostgreSQL 向量相似度搜索部署指南:pgvector 在 Windows 上 3 阶段编译安装与验证

【免费下载链接】pgvectorOpen-source vector similarity search for Postgres项目地址: https://gitcode.com/GitHub_Trending/pg/pgvector

pgvector 是 PostgreSQL 生态里最主流的开源向量相似度搜索扩展,让你把向量数据和高维检索直接放进数据库,支持精确和近邻搜索。如果你打算在 Windows 上用它,大概率卡在同一个地方:命令行窗口里一堆"不是内部或外部命令"、找不到postgres.hAccess is denied。本文把整个流程压缩成 3 个阶段——环境自检、编译安装、SQL 验证——全程大约 30 分钟,并且把 Windows 上最常见的 4 个报错整理成一张对照表,照着排查即可。

动手前的版本选型对照表:先确认这套组合是绿的

Windows 编译 pgvector 的翻车,八成发生在"环境组合"上,而不是编译命令本身。所以在装任何东西之前,先把下面这张表过一遍,确认你的版本搭配落在支持范围内:

组件推荐选择说明
pgvector 源码v0.8.6(当前稳定版)支持 Postgres 13 及以上;0.8.0 起已不再支持 Postgres 12
PostgreSQL13–18装 Postgres 17 的话请用 17.3+,17.0–17.2 存在链接期符号缺失问题
编译器Visual Studio 2022(勾选"使用 C++ 的桌面开发")需要 C++ 桌面开发工作负载 + Windows SDK
命令行窗口x64 Native Tools Command Prompt(管理员运行)必须与 Postgres 的位数一致,详见避坑表

⚠️ 注意:Postgres 安装时组件列表里要勾选Development Files(头文件和postgres.lib)。漏勾这一项,后面无论怎么设置环境变量,编译都会卡在找不到postgres.h

💡 提示:如果你暂时不想折腾编译器,可以先看仓库里的 Dockerfile 了解容器化装法,把编译问题留到以后——但本文的主线是原生编译。

版本对齐之后,剩下要做的就是三件事:自检、编译、验证。下面按阶段走。

阶段一:环境自检——3 条命令确认工具链就绪

打开"x64 Native Tools Command Prompt for VS 2022"(开始菜单搜索即可,以管理员身份运行)。不要使用普通的 cmd 或 PowerShell,因为这个窗口会预先配好 MSVC 的cl.exenmake.exe路径,普通窗口里没有。

在这个窗口里依次执行:

cl nmake echo %PGROOT%

前两条应分别显示cl/nmake的用法说明,说明编译器和构建工具在 PATH 里。第三条用来检查 PGROOT 是否已经被设置过——如果为空,不用慌,阶段二第一步就会设置它。

另外确认一下 Postgres 的开发文件真的在:

dir "C:\Program Files\PostgreSQL\18\include\server\postgres.h"

能把这个文件列出来,阶段一的 4 项检查(编译器、构建工具、PGROOT、头文件)就全部过关了。

阶段二:编译安装——同一个窗口里跑完 6 条命令

⚠️ 注意:以下命令必须在阶段一的同一个 x64 Native Tools 窗口中执行,换窗口 = PGROOT 和前序环境变量全部丢失。

设置 PGROOT 并拉取源码(版本号换成你的实际安装目录):

set "PGROOT=C:\Program Files\PostgreSQL\18" cd %TEMP% git clone --branch v0.8.6 https://gitcode.com/GitHub_Trending/pg/pgvector.git cd pgvector

编译并安装:

nmake /F Makefile.win nmake /F Makefile.win install

🔧 说明:Windows 上的构建入口是 Makefile.win,它会把 src/ 目录下的 19 个 C 源文件编译成vector.dll,并把vector.dllvector.controlsql\下的升级脚本复制到 Postgres 的libshare\extension目录。install这一步需要写入C:\Program Files下,所以窗口必须保持管理员权限,否则会出现Access is denied

编译顺利的话,整个过程一两分钟内完成,结尾会生成vector.dll。如果报错,先别慌着重装,直接翻到文末的排查表,Windows 的报错基本就那几类。

阶段三:验证——5 条 SQL 确认向量搜索功能上线

psql连上数据库,按顺序执行下面这段最小可运行示例。它覆盖了扩展注册、建表、写入、L2 近邻和余弦相似度 5 个关键动作:

CREATE EXTENSION vector; CREATE TABLE test_vectors ( id bigserial PRIMARY KEY, embedding vector(3) ); INSERT INTO test_vectors (embedding) VALUES ('[1,2,3]'), ('[4,5,6]'), ('[7,8,9]'); SELECT id, embedding FROM test_vectors ORDER BY embedding <-> '[3,1,2]' LIMIT 1; SELECT id, 1 - (embedding <=> '[3,1,2]') AS cosine_similarity FROM test_vectors ORDER BY embedding <=> '[3,1,2]';

预期结果:

  • 最后一条查询返回 3 行,id = 1的余弦相似度最高(约 0.994),因为它和查询向量[3,1,2]方向最接近;
  • <->返回的是 L2 距离,数值越小越近;<#>(内积)和<+>(L1)也是同款语法,只是换操作符。

如果 5 条语句都执行成功且排序符合直觉,说明从编译到索引路径这条链路已经通了。

报错排查表:Windows 编译 pgvector 的 4 个高频故障

对照"现象 → 原因 → 解法"三栏自查,绝大多数失败都能在 5 分钟内定位:

现象原因解法
编译即停:PGROOT is not setMakefile.win 把 PGROOT 设为必选项(!error指令)在当前窗口执行set "PGROOT=C:\Program Files\PostgreSQL\18"后重跑nmake /F Makefile.win
Cannot open include file: 'postgres.h'PGROOT 指错了目录,或 Postgres 没装开发文件dir %PGROOT%\include\server\postgres.h验证;文件不存在就重装 Postgres 并勾选 Development Files
error C2196: case value '4' already used用错命令窗口,编译位数与 Postgres 不匹配换成 x64 Native Tools Command Prompt,先跑nmake /F Makefile.win clean清掉旧产物再重新编译
Access is denied(install 阶段)窗口没有管理员权限,无法写入 Postgres 安装目录右键"以管理员身份运行"重开 x64 窗口,从set PGROOT开始重走一遍

⚠️ 注意:Postgres 17.0–17.2 在链接阶段还会报unresolved external symbol float_to_shortest_decimal_bufn,这是 Postgres 早期小版本的已知问题,把 Postgres 升级到 17.3+ 即可,与 pgvector 无关。

如果你的报错不在表里,优先怀疑环境而非代码:src/ 目录下的 C 源码是纯 C 实现,本身没有第三方依赖。

从"能装"到"能查":近似索引选型的 2 分钟决策

验证通过后,很多人下一步会问:表数据上万之后,逐行算距离还撑得住吗?这时就该上近似最近邻索引了。pgvector 提供两种,选型看这张表:

维度HNSWIVFFlat
查询性能(速度-召回权衡)更好较低
建索引速度慢,吃内存快,内存占用小
空表能否建索引不能(有 k-means 训练步骤,需先有数据)
关键参数ef_construction(默认 64)、查询时hnsw.ef_search(默认 40)lists(建议 rows/1000 起步)、查询时ivfflat.probes

两种索引都按"每种距离函数建一个"的方式创建:

CREATE INDEX ON items USING hnsw (embedding vector_l2_ops); -- 或 CREATE INDEX ON items USING ivfflat (embedding vector_l2_ops) WITH (lists = 100);

💡 提示:索引建好后,召回率和速度是一对跷跷板——HNSW 调SET hnsw.ef_search = 100;,IVFFlat 调SET ivfflat.probes = 10;,数值越大召回越高、查询越慢。大表建 HNSW 索引前记得SET maintenance_work_mem = '8GB';,图能装进内存时构建会显著加快。完整的参数说明和过滤场景示例都在 README.md 的 Indexing 一节。

收尾:自查清单与接下来的 3 个方向

用这份 checklist 给今天的成果做个归档:

  • vector.dll已存在于%PGROOT%\libvector.control已存在于%PGROOT%\share\extension
  • CREATE EXTENSION vector在你的目标数据库执行成功
  • L2(<->)与余弦(<=>)两条查询均返回了合理排序
  • 已了解 HNSW 与 IVFFlat 的适用边界,知道从哪个参数入手调召回

接下来三个方向,按实用程度排序:

  1. 换向量类型:试试halfvec(半精度,省一半存储)和sparsevec(稀疏数据),语法见 sql/vector.sql 里的类型定义;
  2. 加索引实测召回:造一张 10 万行的表,分别建 HNSW 和 IVFFlat,对比同LIMIT下的查询耗时;
  3. 接入业务:把 embedding 生成模型输出的向量写入vector(1536)列,用一条ORDER BY ... <->替换掉应用层的手算距离。

向量搜索这件事,门槛在环境,价值在查询。环境这一关你已经过了,剩下的都是把 pgvector 嵌进业务流程的工程活——从最小可运行示例开始,逐步把真实数据搬进去就好。

【免费下载链接】pgvectorOpen-source vector similarity search for Postgres项目地址: https://gitcode.com/GitHub_Trending/pg/pgvector

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询