PgVectore的使用
一、PgVector的安装
参照博客
:https://blog.csdn.net/u012953777/article/details/147013691?spm=1001.2014.3001.5501
二、PgVector的使用
1、创建表与插入数据
- 定义向量字段:
CREATE TABLE items (id SERIAL PRIMARY KEY,embedding VECTOR(768), -- 768维向量(如BERT模型输出)metadata JSONB
);
- 插入向量数据
INSERT INTO items (embedding, metadata) VALUES ('[0.1, 0.3, ..., 0.8]', '{"title": "文档1"}'),('[0.4, 0.2, ..., 0.7]', '{"title": "文档2"}');
2、 索引优化
pgvector 支持两种索引类型,针对不同场景优化:
HNSW 索引
- 适用场景:高查询速度,适合静态数据(较少更新)。
- 创建索引:
CREATE INDEX ON items USING hnsw (embedding vector_cosine_ops)WITH (m = 16, ef_construction = 64);
- m:每层的最大邻居数(默认16,范围4-100)
- ef_construction:构建时的搜索范围(默认100,影响构建速度和精度)
IVFFlat 索引
适用场景:快速构建,适合动态数据(频繁更新)。
创建索引:
CREATE INDEX ON items USING ivfflat (embedding vector_l2_ops)WITH (lists = 100);
运算符类选择
vector_l2_ops
:欧氏距离(L2)
vector_ip_ops
:内积相似度
vector_cosine_ops
:余弦相似度
3、相似性搜索
- 基础查询:
SELECT * FROM items
ORDER BY embedding <-> '[0.5, 0.1, ..., 0.9]' -- 按L2距离排序
LIMIT 10;
- 动态调整搜索参数(HNSW):
SET hnsw.ef_search = 200; -- 扩大搜索范围以提高召回率
- 余弦相似度查询:
SELECT id, 1 - (embedding <=> '[0.3, ..., 0.2]') AS cosine_similarity
FROM items
ORDER BY cosine_similarity DESC
LIMIT 5;
4、性能优化技巧
-
索引构建时机:在数据导入后创建索引,避免频繁更新导致重建。
-
参数调优:
- HNSW:增大 ef_construction 和 ef_search 提高精度,但会降低速度
- IVFFlat:增加 lists 提升准确性,但增加内存占用
-
归一化处理:使用余弦相似度前,确保向量已归一化(模长为1)
5、高级用法
混合搜索(向量 + 条件过滤)
SELECT * FROM items
WHERE metadata->>'category' = '科技'
ORDER BY embedding <=> '[0.2, ..., 0.6]'
LIMIT 10;
分页查询
SELECT * FROM items
ORDER BY embedding <-> '[0.7, ..., 0.1]'
OFFSET 20 LIMIT 10;
6、维护操作
- 重建索引:
REINDEX INDEX items_hnsw_index;
- 更新索引参数:
ALTER INDEX items_hnsw_index SET (ef_construction = 128);
7、注意事项
* 维度限制:pgvector 支持最高 16,000 维。
* 内存管理:大规模数据需确保足够内存,尤其是IVFFlat索引。
* 数据一致性:频繁更新时,IVFFlat可能需要定期重建索引。