跳到主要内容

使用 SQL 快速进行向量搜索

seekdb 支持使用 SQL 语言进行向量搜索,本文介绍了快速上手方法。

快速上手

创建向量列和索引

创建表时,可以使用 VECTOR(dim) 数据类型声明指定列为向量列及其维度。向量索引需要创建在向量列上,且至少需要提供 typedistance 两个参数。

示例中创建向量列 embedding,向量数据维度为 3,并在 embedding 列上创建 HNSW 索引,指定距离算法为 L2。

CREATE TABLE t1(
id INT PRIMARY KEY,
doc VARCHAR(200),
embedding VECTOR(3),
VECTOR INDEX idx1(embedding) WITH (distance=L2, type=hnsw)
);

在数据量较大的情况下建议先导入完数据再创建向量索引。

写入向量数据

为了模拟在向量搜索的场景,需要先构造一些向量数据,每行数据都包括对数据的描述和对应的向量。示例中假设 '苹果' 对应的向量为 '[1.2,0.7,1.1]''胡萝卜' 对应的向量为 '[5.3,4.8,5.4]' 等。

INSERT INTO t1
VALUES (1, '苹果', '[1.2,0.7,1.1]'),
(2, '香蕉', '[0.6,1.2,0.8]'),
(3, '橙子','[1.1,1.1,0.9]'),
(4, '胡萝卜', '[5.3,4.8,5.4]'),
(5, '菠菜', '[4.9,5.3,4.8]'),
(6, '西红柿','[5.2,4.9,5.1]');

为了方便展示,本例简化了向量的维度,仅使用了 3 维向量,且向量是人工生成的。在实际应用中,需要使用嵌入模型对真实的文本进行生成,维度会达到数百或上千维。

可以通过查询表中的数据查看是否写入成功。

SELECT * FROM t1;

预期返回结果如下:

+----+-----------+---------------+
| id | doc | embedding |
+----+-----------+---------------+
| 1 | 苹果 | [1.2,0.7,1.1] |
| 2 | 香蕉 | [0.6,1.2,0.8] |
| 3 | 橙子 | [1.1,1.1,0.9] |
| 4 | 胡萝卜 | [5.3,4.8,5.4] |
| 5 | 菠菜 | [4.9,5.3,4.8] |
| 6 | 西红柿 | [5.2,4.9,5.1] |
+----+-----------+---------------+
6 rows in set

执行向量搜索

进行向量搜索需要提供向量作为搜索条件。假设我们需要找到所有 '水果',其对应的向量为 [0.9, 1.0, 0.9],则对应 SQL 为:

SELECT id, doc FROM t1
ORDER BY l2_distance(embedding, '[0.9, 1.0, 0.9]')
APPROXIMATE LIMIT 3;

预期返回结果如下:

+----+--------+
| id | doc |
+----+--------+
| 3 | 橙子 |
| 2 | 香蕉 |
| 1 | 苹果 |
+----+--------+
3 rows in set

相关文档