pgvector

PostgreSQL pgvector 向量检索

补充说明

pgvector 是 PostgreSQL 扩展,在关系表里直接存储和检索向量,适合已有 PostgreSQL、数据量中等且希望减少独立向量数据库的场景。支持 L2、内积和余弦距离。

常用示例

安装扩展:

psql -c "CREATE EXTENSION vector;"

建表和索引:

psql <<'SQL'
CREATE TABLE docs (
  id bigserial PRIMARY KEY,
  content text,
  embedding vector(1536)
);
CREATE INDEX ON docs USING hnsw (embedding vector_cosine_ops);
SQL

插入向量:

psql -c "INSERT INTO docs (content, embedding) VALUES ('磁盘满排查', '[0.1,0.2]');"

相似度查询:

psql -c "SELECT id, content, 1 - (embedding <=> '[0.1,0.2]') AS score
FROM docs ORDER BY embedding <=> '[0.1,0.2]' LIMIT 5;"

带条件过滤:

psql -c "SELECT id FROM docs WHERE source = 'faq'
ORDER BY embedding <=> '[0.1,0.2]' LIMIT 5;"

查看索引使用情况:

psql -c "SELECT indexname, indexdef FROM pg_indexes WHERE tablename='docs';"

易错点与排错

读完自测

合上页面,先回答,再展开对照。

  1. 建表时报 vector 类型不存在,先查什么?
  2. <->、<#>、<=> 分别对应什么距离?
  3. 带 WHERE 过滤的相似度查询没有用上索引,先看什么?
答案
  1. 是否安装了 vector 扩展。
  2. L2、内积、余弦,选错会导致结果异常。
  3. 查询计划,先过滤再排序可能导致索引失效,并结合 ANALYZE。