PostgreSQL 向量检索方式(pgvector)

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 会执行 精确最近邻搜索,保证高召回率。

  1. 小规模数据表:可以直接使用顺序扫描进行查询,例如:
sql 复制代码
SELECT * FROM documents
ORDER BY embedding <=> '[...]'
LIMIT 5;

适合几千条以内的数据,无需额外索引。

  1. 大规模数据表

    (1) 顺序扫描效率低,需要 向量索引 提升检索速度。

    (2)常用的近似最近邻(ANN, Approximate Nearest Neighbor)算法包括 IVFFlat 和 HNSW。

  2. HNSW 索引

    (1)构建多层图结构,实现高效近似最近邻搜索。

    (2)优势:比 IVFFlat 查询性能更好,速度与召回率平衡更优。

    (3)特点:构建时间较长,内存占用较高。支持在空表上创建索引,无需训练数据(不像 IVFFlat 需要先聚类训练)

二. 支持的索引类型

2.1 IVFFlat(Inverted File Flat)

原理:

  1. 聚类向量,将向量分到不同的簇(lists)
  2. 查询向量只搜索最相近的几个簇
  3. 适用于静态数据

特点:

  1. 支持 L2、Cosine、Inner Product
  2. 精度可调(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);

原理:

  1. 基于图的近似最近邻算法
  2. 构建多层图,搜索时从顶层快速定位候选节点

特点:

  1. 查询速度快,精度高
  2. 插入数据可以动态更新

建索引示例:

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

转载说明:务必注明来源,附带本人博客连接。

相关推荐
人工智能技术咨询.7 小时前
具身智能中的世界模型训练
人工智能
LaughingZhu7 小时前
Product Hunt 每日热榜 | 2026-10-06
人工智能·深度学习·神经网络·搜索引擎·百度
AOI小白新手上路7 小时前
AOI 缺陷检测复现实操指南:Anomalib + MVTec AD(glass)与 YOLOv8 + NEU-DET 两条路线
人工智能·深度学习·yolo
阳光九叶草LXGZXJ7 小时前
达梦数据库-报错-15-列【XXX】长度超出定义
linux·运维·数据库·sql·学习
henrylin99997 小时前
RD-AGENT 第一讲 · AI 因子工厂是怎么运转的
人工智能
高洁018 小时前
具身智能中的世界模型训练
人工智能·python·深度学习·机器学习·transformer
无线通信科研笔记8 小时前
IEEE TVT 2026 论文精读与完整复现|相位误差如何重塑近场 RIS 的幅相响应
论文阅读·人工智能·python·算法·论文笔记
字节渡客8 小时前
Redis键明明过期了,业务还在读到旧数据
数据库·redis·spring
Devlive 开源社区8 小时前
AuthX 正式更名 GrantForge:我们重新做了一遍权限管理系统
大数据·人工智能·架构
朝朝辞暮i8 小时前
VLA 系统学习第 1 课:VLA 到底在干什么?
人工智能·python·计算机视觉·vla