导入
PostgreSQL中pgvector扩展简介
了解 PostgreSQL 中的 pgvector 扩展,其距离函数及索引机制。
...
启用 pgvector
1CREATE EXTENSION vector;
创建表并插入数据
1CREATE TABLE products (id bigserial PRIMARY KEY, embedding vector(3)); 2 3INSERT INTO products (embedding) VALUES ('[1,2,3]'), ('[4,5,6]');
余弦相似度
1-- 对于余弦相似度,使用 1 - 余弦距离 2SELECT 1 - (embedding <=> '[3,1,2]') AS cosine_similarity FROM products;
欧几里得距离
1-- L2 距离 2SELECT (embedding <-> '[3,1,2]') AS similarity FROM products;
内积(点积)
1-- 乘以 -1(因为 <#> 返回的是负的内积) 2SELECT (embedding <#> '[3,1,2]') * -1 AS similarity FROM products;
表格对比
| 方面 | 余弦相似度 | L2 距离 | 内积(点积) |
|---|---|---|---|
| pgvector 操作符 | <=> | <-> | <#> |
| 定义 | 衡量向量之间的夹角 | 衡量向量间的欧几里得距离 | 衡量一个向量在另一个向量上的投影 |
| 解读方式 | 值越大表示越相似 | 值越小表示越相似 | 值越大表示越相似 |
| 适用场景 | 适用于文本相似度,词频(向量模长)影响较小的情况 | 适用于空间数据或需要关注绝对距离的场景 | 适用于方向和模长都重要的情况 |
索引创建示例
1-- 余弦相似度 2CREATE INDEX ON products USING hnsw (embedding vector_cosine_ops); 3 4-- L2 距离 5CREATE INDEX ON products USING hnsw (embedding vector_l2_ops); 6 7-- 内积 8CREATE INDEX ON products USING hnsw (embedding vector_ip_ops);
IVFFlat 类型索引创建示例
1-- 余弦相似度 2CREATE INDEX ON products USING ivfflat (embedding vector_cosine_ops) WITH (lists = 100); 3 4-- L2 距离 5CREATE INDEX ON products USING ivfflat (embedding vector_l2_ops) WITH (lists = 100); 6 7-- 内积 8CREATE INDEX ON products USING ivfflat (embedding vector_ip_ops) WITH (lists = 100);