PostgreSQL 向量检索方式(pgvector)
-
- [一. 背景](#一. 背景)
- [二. 支持的索引类型](#二. 支持的索引类型)
-
- [2.1 IVFFlat(Inverted File Flat)](#2.1 IVFFlat(Inverted File Flat))
- [2.2 HNSW(Hierarchical Navigable Small World)](#2.2 HNSW(Hierarchical Navigable Small World))
- [2.3 顺序扫描(Sequential Scan)](#2.3 顺序扫描(Sequential Scan))
- [三. 操作符支持](#三. 操作符支持)
- [四. Postgres的其他索引](#四. Postgres的其他索引)
- [五. 对比总结](#五. 对比总结)
前言
这是我在这个网站整理的笔记,有错误的地方请指出,关注我,接下来还会持续更新。
作者:神的孩子都在歌唱
一. 背景
在 PostgreSQL 中,向量类型 (VECTOR
) 可以直接使用 <->
、<=>
、<#>
等操作符进行检索。默认情况下,pgvector 会执行 精确最近邻搜索,保证高召回率。
- 小规模数据表:可以直接使用顺序扫描进行查询,例如:
sql
SELECT * FROM documents
ORDER BY embedding <=> '[...]'
LIMIT 5;
适合几千条以内的数据,无需额外索引。
-
大规模数据表
(1) 顺序扫描效率低,需要 向量索引 提升检索速度。
(2)常用的近似最近邻(ANN, Approximate Nearest Neighbor)算法包括 IVFFlat 和 HNSW。
-
HNSW 索引
(1)构建多层图结构,实现高效近似最近邻搜索。
(2)优势:比 IVFFlat 查询性能更好,速度与召回率平衡更优。
(3)特点:构建时间较长,内存占用较高。支持在空表上创建索引,无需训练数据(不像 IVFFlat 需要先聚类训练)
二. 支持的索引类型
2.1 IVFFlat(Inverted File Flat)
原理:
- 聚类向量,将向量分到不同的簇(lists)
- 查询向量只搜索最相近的几个簇
- 适用于静态数据
特点:
- 支持 L2、Cosine、Inner Product
- 精度可调(lists 越多,精度越高,但索引/查询成本增加)
建索引示例:
sql
-- 欧氏距离
CREATE INDEX idx_l2
ON kb_documents
USING ivfflat (embedding vector_l2_ops)
WITH (lists = 100);
-- 余弦距离
CREATE INDEX idx_cosine
ON kb_documents
USING ivfflat (embedding vector_cosine_ops)
WITH (lists = 100);
2.2 HNSW(Hierarchical Navigable Small World)
原理:
- 基于图的近似最近邻算法
- 构建多层图,搜索时从顶层快速定位候选节点
特点:
- 查询速度快,精度高
- 插入数据可以动态更新
建索引示例:
sql
CREATE INDEX idx_hnsw
ON documents
USING hnsw (embedding vector_cosine_ops)
WITH (m = 16, ef_construction = 200);
参数说明:
m
:每个节点的邻居数量ef_construction
:索引构建时考虑的邻居数
2.3 顺序扫描(Sequential Scan)
原理:直接对每个向量计算距离
适用场景:
- 小表(几千条以内)
- 临时测试或开发环境
示例查询:
sql
SELECT id, content
FROM kb_documents
ORDER BY embedding <=> '[0.1,0.2,...]'
LIMIT 5;
三. 操作符支持
操作符 | 距离度量 | 说明 |
---|---|---|
<-> |
欧氏距离 L2 | 越小越相似 |
<=> |
余弦距离 | 越小越相似 |
<#> |
负内积 | 内积越大越相似 |
IVFFlat / HNSW 都可配合这些操作符使用。
四. Postgres的其他索引
Postgres 提供了多种索引类型:B 树(默认)、哈希、GiST、SP-GiST、GIN 和 BRIN。在许多情况下,这些索引可以提供快速、精确的最近邻搜索。
sql
CREATE INDEX ON items (category_id);
CREATE INDEX ON items (location_id, category_id);
五. 对比总结
特性 | IVFFlat | HNSW |
---|---|---|
索引结构 | 聚类 + 倒排表 | 分层图(Small World Graph) |
构建方式 | 批量训练 K-Means | 动态增量构建 |
查询方式 | 先找簇中心,再簇内扫描 | 顶层贪心搜索 → 底层精确搜索 |
插入支持 | 批量插入,动态插入有限 | 支持实时动态插入 |
精度 | 可调,依赖 nprobe | 高精度 |
查询速度 | 中等 | 快 |
内存消耗 | 较低 | 较高 |
适用场景 | 大批量静态向量 | 大规模动态向量、高维数据 |
作者:神的孩子都在歌唱
本人博客:https://blog.csdn.net/weixin_46654114
转载说明:务必注明来源,附带本人博客连接。