本文介绍向量数据库基础使用方法。
创建插件和向量表
使用高权限账号在目标数据库创建插件。
PGVector插件的作用域是Database级别,如果需要在集群的多个Database中使用向量能力,请为每个Database分别创建向量插件。
CREATE EXTENSION IF NOT EXISTS vector;
创建插件成功后,您可执行以下语句创建向量表。
创建一个具有3个维度的向量表。
CREATE TABLE items (id bigserial PRIMARY KEY, embedding vector(3));
插入向量。
INSERT INTO items (embedding) VALUES ('[1,2,3]'), ('[4,5,6]');
按欧几里得距离(L2)获取最近邻。
SELECT * FROM items ORDER BY embedding <-> '[3,1,2]' LIMIT 5;
还支持内积 (
<#>
)、余弦距离 (<=>
) 和L1距离 (<+>
)。<#>
返回负的内积,因为PostgreSQL仅支持对操作符进行升序索引扫描。
存储
创建一个具有3个维度的向量表。
CREATE TABLE items (id bigserial PRIMARY KEY, embedding vector(3));
您也可以为现有表增加向量列
ALTER TABLE items ADD COLUMN embedding vector(3);
。插入向量。
基础向量插入。
INSERT INTO items (embedding) VALUES ('[1,2,3]'), ('[4,5,6]');
使用COPY批量加载向量。
COPY items (embedding) FROM STDIN WITH (FORMAT BINARY);
插入向量,同时处理潜在的冲突(例如,主键冲突)。
INSERT INTO items (id, embedding) VALUES (1, '[1,2,3]'), (2, '[4,5,6]') ON CONFLICT (id) DO UPDATE SET embedding = EXCLUDED.embedding;
此时如果新插入数据与现有数据存在主键冲突,则更新现有行的
embedding
列为新值,从而确保数据唯一性。
更新向量。
UPDATE items SET embedding = '[1,2,3]' WHERE id = 1;
删除向量。
DELETE FROM items WHERE id = 1;
查询
距离
获取与某个向量最近邻。
SELECT * FROM items ORDER BY embedding <-> '[3,1,2]' LIMIT 5;
支持的距离函数包括:
<->
:欧几里得距离(L2)。<#>
:内积距离(inner product)。<=>
:余弦距离(cosine)。<+>
:曼哈顿距离(L1)。<~>
:汉明距离(Hamming)(二进制向量)。<%>
:Jaccard距离(二进制向量)。
示例
在使用索引时,建议结合ORDER BY
和LIMIT
。
获取与某一行的5个最近邻并排序。
SELECT * FROM items WHERE id != 1 ORDER BY embedding <-> (SELECT embedding FROM items WHERE id = 1) LIMIT 5;
获取在特定距离范围内的行。
SELECT * FROM items WHERE embedding <-> '[3,1,2]' < 5;
获取距离。
SELECT embedding <-> '[3,1,2]' AS distance FROM items;
获取内积距离。
由于
<#>
返回负的内积,乘以-1
。SELECT (embedding <#> '[3,1,2]') * -1 AS inner_product FROM items;
获取余弦距离,此处使用
1-余弦距离
值。SELECT 1 - (embedding <=> '[3,1,2]') AS cosine_similarity FROM items;
聚合
平均向量。
SELECT AVG(embedding) FROM items;
按组平均向量。
SELECT id, AVG(embedding) FROM items GROUP BY id;
该文章对您有帮助吗?
- 本页导读
- 创建插件和向量表
- 存储
- 查询
- 距离
- 聚合