返回

pgvector 使用教程:PostgreSQL 向量搜索实战与性能优化指南

2026-05-27 pgvector PostgreSQL 6 0

随着 AI 搜索、知识库问答、推荐系统和 RAG(检索增强生成)的流行,越来越多开发者希望直接在关系型数据库中实现向量搜索能力。作为 PostgreSQL 的向量扩展,pgvector 可以让数据库支持向量存储、相似度搜索以及近似最近邻检索,无需额外引入专门的向量数据库。pgvector 支持向量字段、距离计算、索引优化,并可结合传统 SQL 查询实现混合搜索能力。

什么是 pgvector

PostgreSQL 的 pgvector 是一个开源扩展,它为 PostgreSQL 增加了向量类型与向量相似度检索能力,可以将文本、图片、用户行为等 Embedding 数据直接存储到数据库中,并通过 SQL 实现语义搜索。开发者可以在已有数据库架构中完成向量检索,而不需要额外维护独立向量数据库。

常见应用场景包括:

  • AI 知识库检索(RAG)
  • 智能问答系统
  • 相似商品推荐
  • 文本语义搜索
  • 图像特征匹配
  • 用户兴趣推荐

相比单独部署向量数据库,pgvector 的优势在于可以直接复用 PostgreSQL 的事务能力、JOIN 查询、备份恢复和权限控制机制。

安装 pgvector 扩展

首先确保 PostgreSQL 已安装,然后执行扩展安装。

在数据库中启用扩展:

CREATE EXTENSION vector;

或者:

CREATE EXTENSION IF NOT EXISTS vector;

执行后,数据库即可支持向量类型。很多云数据库服务已经默认支持 pgvector,例如 PostgreSQL 托管环境与云服务平台。

创建向量数据表

假设需要存储文章内容向量,可以创建如下数据表:

CREATE TABLE articles (
    id BIGSERIAL PRIMARY KEY,
    title TEXT,
    content TEXT,
    embedding VECTOR(1536)
);

这里:

  • VECTOR(1536) 表示向量维度
  • 1536 常见于 Embedding 模型输出维度
  • embedding 用于存储文本语义向量

插入示例数据:

INSERT INTO articles (title, content, embedding)
VALUES
(
    'PostgreSQL 教程',
    '数据库基础知识',
    '[0.12,0.55,0.78,0.21]'
);

pgvector 使用数组格式保存向量数据。

pgvector 向量搜索实战

向量搜索的核心是相似度计算。

例如查询与目标向量最相似的内容:

SELECT
    id,
    title
FROM articles
ORDER BY embedding <-> '[0.15,0.56,0.79,0.19]'
LIMIT 5;

其中:

  • <-> 表示欧氏距离(L2 Distance)
  • 距离越小,相似度越高

这是最基础的最近邻搜索方式。

pgvector 还支持多种距离计算方式:

1. 欧氏距离

embedding <-> vector

适用于一般向量距离计算。

2. 余弦距离

embedding <=> vector

通常用于文本语义搜索,尤其适合 Embedding 检索。

3. 内积搜索

embedding <#> vector

常见于推荐系统与相似度排序。

创建向量索引提升性能

如果数据量达到几十万甚至百万级,仅靠全表扫描会变慢,因此建议建立向量索引。

1. 使用 HNSW 索引

CREATE INDEX idx_articles_embedding
ON articles
USING hnsw (embedding vector_cosine_ops);

特点:

  • 查询速度快
  • 高召回率
  • 更适合生产环境

HNSW 通常被认为是 pgvector 中更主流的近似搜索方案,但构建成本和内存消耗较高。

2. 使用 IVFFlat 索引

CREATE INDEX idx_articles_embedding_ivf
ON articles
USING ivfflat (embedding vector_cosine_ops)
WITH (lists = 100);

特点:

  • 构建较快
  • 内存占用低
  • 适合大规模向量数据

但它通常需要提前训练索引,对查询准确率与性能之间做平衡。

pgvector 与全文检索结合

真实业务中,通常不会只依赖向量搜索,而是将 PostgreSQL 的全文检索与向量检索结合,实现 Hybrid Search(混合搜索)。

例如:

SELECT
    id,
    title
FROM articles
WHERE content @@ plainto_tsquery('数据库')
ORDER BY embedding <=> '[0.15,0.56,0.79]'
LIMIT 10;

这样既可以满足关键词精准匹配,又兼顾语义理解效果,更适合知识库、智能搜索等场景。

pgvector 实战应用场景

1. AI 知识库问答

用户问题转换为向量后,匹配最相关文档,再交给大模型生成答案。

2. 内容推荐系统

根据用户行为向量寻找相似内容,实现个性化推荐。

3. 智能搜索

相比传统关键词搜索,向量搜索可以理解语义。

例如,用户搜索“数据库扩容”,系统也可能找到“数据库分库分表”、“数据库水平扩展”,因为语义更接近,而不仅依赖关键词。

pgvector 使用建议与避坑

在生产环境中,建议注意以下问题:

  1. 小数据量不要急着建向量索引,全量扫描可能更准确。
  2. 优先使用余弦距离处理文本 Embedding。
  3. 大规模检索优先考虑 HNSW。
  4. 结合 PostgreSQL 普通字段过滤,避免无意义向量扫描。
  5. 尽量使用混合搜索提升准确率。

社区讨论中,一个常见误区是认为向量索引一定必要,但实际效果取决于数据规模、过滤条件和查询模式。

总体来看,pgvector 是 PostgreSQL 进入 AI 检索时代的重要扩展,它允许开发者在已有数据库体系中直接实现向量搜索,不仅减少架构复杂度,还能复用成熟数据库生态。对于希望快速构建 AI 知识库、语义搜索、推荐系统的团队来说,pgvector 是一个成本低、上手快且非常实用的方案。

顶部