使用 SQL 快速进行向量搜索
seekdb 支持使用 SQL 语言进行向量搜索,本文介绍了快速上手方法。
快速上手
创建向量列和索引
创建表时,可以使用 VECTOR(dim) 数据类型声明指定列为向量列及其维度。向量索引需要创建在向量列上,且至少需要提供 type 和 distance 两个参数。
示例中创建向量列 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