来源:https://blog.csdn.net/frenzytechai/article/details/131552053
1. clone 代码
git@github.com:pgvector/pgvector.git
https://github.com/pgvector
2. 启动一个容器
version: '3'
services:
pgvector_server:
image: postgres:15-bullseye
restart: always
environment:
POSTGRES_DB: facedb
POSTGRES_USER: root
POSTGRES_PASSWORD: 642a4dc6-cc76-4ebb-b828-f2c6125911a4
network_mode: bridge
ports:
- 12532:5432
volumes:
- ./postgresql/data:/var/lib/postgresql/data
- ./:/workspace
3. 安装依赖
先替换一下 apt 源
sed -i 's#http://deb.debian.org#http://mirrors.aliyun.com#g' /etc/apt/sources.list.d/debian.sources
安装依赖
apt update
apt install -y make gcc libpq-dev postgresql-server-dev-all
貌似使用这种方式安装的 pg 版本是最新的,当前的版本号是16,所以这个向量插件也是支持的16。
4. 编译、安装
make && make install
5. 启用扩展、插入向量
- 启用扩展
CREATE EXTENSION IF NOT EXISTS vector;
- 创建一个存储向量的表
CREATE TABLE items (id bigserial PRIMARY KEY, name varchar(10), features vector(3));
- 插入数据
INSERT INTO items (features) VALUES ('[1,2,3]'), ('[4,5,6]');
- 更新插入
INSERT INTO items (id, features) VALUES (1, '[1,2,3]'), (2, '[4,5,6]') ON CONFLICT (id) DO UPDATE SET features = EXCLUDED.features;
6. pgvector 查询运算符
<->
欧几里德距离。欧几里德距离是多维空间中向量表示的点之间的直线距离。较小的欧几里德距离表示向量之间的相似性较大,因此该运算符在查找和排序相似项目时非常有用。
SELECT id, name, features, features <-> '[0.45, 0.4, 0.85]' as distance
FROM items
ORDER BY features <-> '[0.45, 0.4, 0.85]';
<=>
余弦相似度。余弦相似度比较两个向量的方向而不是它们的大小。余弦相似度的范围在 -1 到 1 之间,1 表示向量相同,0 表示无关,-1 表示向量指向相反方向。
SELECT id, name, features, features <=> '[0.45, 0.4, 0.85]' as similarity
FROM items
ORDER BY features <=> '[0.45, 0.4, 0.85]' DESC;
<#>
曼哈顿距离(也称为 L1 距离或城市街区距离)。曼哈顿距离是每个维度对应坐标差的绝对值之和。相对于欧几里德距离而言,曼哈顿距离更加强调沿着维度的较小移动。
SELECT id, name, features, features <#> '[0.45, 0.4, 0.85]' as distance
FROM items
ORDER BY features <#> '[0.45, 0.4, 0.85]';
7. pgvector索引
一些关于 pgvector 索引的建议:
1)、在表中有一定数量的数据后创建索引:在创建索引之前,确保表中有足够的数据,以便索引能够提供更好的查询性能。
2)、选择适当数量的列表:可以根据表的大小来选择适当数量的列表。一般来说,可以使用表的行数除以 1000(最多 1M 行)和平方根(rows)(超过 1M 行)作为起点。
3)、指定适当的探针数量:在执行查询时,可以指定适当的探针数量来平衡查询速度和召回率。一般来说,可以使用列表数量除以 10(最多 1M 行)和平方根(lists)(超过 1M 行)作为起点。
BEGIN;
SET LOCAL ivfflat.probes = 10;
SELECT ...
COMMIT;
- L2距离索引
CREATE INDEX ON items USING ivfflat (features vector_l2_ops) WITH (lists = 100);
- 内积索引
CREATE INDEX ON items USING ivfflat (features vector_ip_ops) WITH (lists = 100);
- 余弦距离索引
CREATE INDEX ON items USING ivfflat (features vector_cosine_ops) WITH (lists = 100);