pgvector不用多介绍, PostgreSQL的向量索引插件, 也可能是数据库领域最早一批支持向量搜索功能的开源插件!
今天把这一系列文章一把梭了(接下来每半个小时发一篇, 敬请关注本公众号)。祝贺PolarDB第二届国赛开赛, 祝愿同学们取得好成绩! ( 必须提前声明一下, 我对赛题细节一无所知! 如果想取得优异的成绩, 建议多关注官方渠道和“PolarDB公众号”! )
本文介绍 pgvector PostgreSQL 扩展(PostgreSQL extension)的高级概述(high-level overview),包括其架构(architecture)、核心功能(core capabilities)和关键组件(key components)。分享帮助理解 pgvector 如何在 PostgreSQL 中实现向量相似性搜索(vector similarity search)所需的基本概念。
pgvector 是一个开源的 PostgreSQL 扩展(extension),它为 PostgreSQL 添加了向量相似性搜索(vector similarity search)功能。它支持存储和查询高维向量嵌入(vector embeddings)以及常规关系数据,并完全支持 PostgreSQL 的 ACID 属性、时间点恢复(point-in-time recovery, PITR)、JOINs(连接)和事务语义(transactional semantics)。
该扩展实现了针对生产使用优化的近似最近邻(approximate nearest neighbor, ANN)搜索算法,使应用程序能够高效地在从数千到数十亿个向量的数据集中查找相似向量。
来源:README.md 1-15
pgvector 提供了以下功能:
Capability (功能) | Description (描述) | Details (详情) |
|---|---|---|
Search Modes (搜索模式) | Exact and approximate nearest neighbor search (精确和近似最近邻搜索) | Exact search for perfect recall (精确搜索实现完美召回); ANN indexes for speed-recall tradeoff (ANN 索引实现速度-召回率的权衡) |
Vector Types (向量类型) | Four vector representations (四种向量表示) | vector (float32), halfvec (float16), sparsevec (sparse float32, 稀疏 float32), bit (binary, 二进制) |
Distance Metrics (距离度量) | Six distance functions (六种距离函数) | L2 distance (L2 距离), inner product (内积), cosine distance (余弦距离), L1 distance (L1 距离), Hamming distance (汉明距离), Jaccard distance (Jaccard 距离) |
Index Methods (索引方法) | Two ANN algorithms (两种 ANN 算法) | HNSW (hierarchical graph, 分层图), IVFFlat (k-means clustering, k-均值聚类) |
Language Support (语言支持) | Any language with PostgreSQL client (任何带有 PostgreSQL 客户端的语言) | 30+ language bindings available (30 多种语言绑定可用) |
PostgreSQL Integration (PostgreSQL 集成) | Full feature compatibility (全面的功能兼容性) | ACID compliance (ACID 合规性), replication (复制), partitioning (分区), parallel queries (并行查询) |
来源:README.md 5-12
下图展示了 pgvector 如何与 PostgreSQL 集成并暴露其功能:

关键集成点 (Key Integration Points):
vector、halfvec、sparsevec、bit)<->、<#>、<=>、<+>、<~>、<%>)hnswhandler、ivfflathandler),它们接入 PostgreSQL 的索引扫描机制(index scan machinery)来源:README.md 1-15README.md 194-203README.md 330-332
下图将系统组件映射到其实现文件:

来源:README.md 942-1059
pgvector 的源代码被组织成功能模块(functional modules):
src/vector.c - vector 类型实现(float32 密集向量)src/halfvec.c - halfvec 类型实现(float16 密集向量)src/sparsevec.c - sparsevec 类型实现(sparse vectors, 稀疏向量)src/bitvector.c - 二进制量化(Binary quantization)和位向量操作(bit vector operations)src/hnsw.c - 主 HNSW 访问方法处理器(access method handler)src/hnswbuild.c - 索引构建逻辑(Index construction logic)src/hnswinsert.c - 插入和更新操作(Insert and update operations)src/hnswscan.c - 搜索算法实现(Search algorithm implementation)src/hnswvacuum.c - VACUUM(清理)和维护操作(maintenance operations)src/hnswutils.c - HNSW 实用函数(Utility functions)src/ivfflat.c - 主 IVFFlat 访问方法处理器(access method handler)src/ivfbuild.c - 使用 k-means(k-均值)进行索引构建src/ivfinsert.c - 插入操作(Insert operations)src/ivfscan.c - 基于列表的搜索实现(List-based search implementation)src/ivfvacuum.c - VACUUM(清理)操作src/ivfkmeans.c - Elkan 的 k-均值聚类算法(Elkan's k-means clustering algorithm)src/ivfutils.c - IVFFlat 实用函数(Utility functions)src/halfutils.c - 使用 F16C 进行半精度浮点转换(Half-precision float conversion)src/bitutils.c - 带有 AVX512 优化的位操作(Bit manipulation)sql/vector--*.sql - 类型、运算符、函数的 SQL 定义(SQL definitions)来源:README.md 1-15
下图展示了 pgvector 如何与 PostgreSQL 的扩展系统(extension system)集成:

来源:README.md 52-57README.md 204-263
Version (版本) | Release Date (发布日期) | Major Changes (主要变化) |
|---|---|---|
0.8.1 | 2025-09-04 | Postgres 18 rc1 支持,binary_quantize性能改进(performance improvements) |
0.8.0 | 2024-10-30 | 迭代索引扫描(Iterative index scans),改进的成本估算(cost estimation),停止支持 Postgres 12 |
0.7.0 | 2024-04-29 | 添加了 halfvec、sparsevec、bit索引(indexing),HNSW 支持 L1 距离(L1 distance) |
0.6.0 | 2024-01-29 | HNSW并行构建(Parallel HNSW builds),将向量存储(vector storage)改为外部存储(external) |
0.5.0 | 2023-08-28 | HNSW 索引类型(HNSW index type)添加,IVFFlat并行构建(parallel builds) |
来源:CHANGELOG.md 1-226README.md 16-50
不同的向量类型和索引方法有不同的维度限制(dimensional limitations):
Vector Type (向量类型) | Maximum Dimensions (Storage) (最大维度(存储)) | Maximum Dimensions (HNSW Index) (最大维度(HNSW 索引)) | Maximum Dimensions (IVFFlat Index) (最大维度(IVFFlat 索引)) |
|---|---|---|---|
vector | 16,000 | 2,000 | 2,000 |
halfvec | 16,000 | 4,000 | 4,000 |
sparsevec | 16,000 non-zero (16,000 个非零元素) | 1,000 non-zero (1,000 个非零元素) | Not supported (不支持) |
bit | 64,000 | 64,000 | 64,000 |
对于更高维度,可以采用半精度索引(half-precision indexing)、二进制量化(binary quantization)或降维(dimensionality reduction)等技术。
来源:README.md 250-254README.md 368-373README.md 813-816README.md 942-945
每种向量类型都有不同的内存占用(memory footprints):
Type (类型) | Storage Formula (存储公式) | Example (3 dimensions) (示例(3 维)) |
|---|---|---|
vector | 4 × dimensions + 8 bytes | 20 bytes |
halfvec | 2 × dimensions + 8 bytes | 14 bytes |
sparsevec | 8 × non-zero + 16 bytes | 40 bytes (3 non-zero, 3 个非零元素) |
bit | dimensions / 8 + 8 bytes | 9 bytes |
这些存储特性(storage characteristics)会影响索引大小(index size)和查询性能(query performance)。选择合适的类型需要在精度要求(precision requirements)与存储和性能约束之间进行权衡。
来源:README.md 944-945README.md 982-983README.md 1020-1021README.md 1037-1039