VECTOR_SEARCH函数用于向量相似性搜索,支持大规模近似最近邻查找。
使用限制
VECTOR_SEARCH函数要求输入表为Delta Table。
命令格式
VECTOR_SEARCH(
{ TABLE base_table | (base_table_query) }, -- 用于搜索最近邻嵌入向量的表
column_to_search, -- 指定基础表中用于搜索最近邻嵌入向量的列名
{ TABLE query_table | (query_table_query) }, -- 提供待查找最近邻嵌入向量的表
query_column_to_search, -- 指定查询表中包含待查找最近邻嵌入向量的列名
top_k -- top_k_value
[, distance_type] -- distance_type_value
[, options] -- json字符串,其他可配置参数
)参数说明
base_table | (base_table_query):必填。用于搜索最近邻嵌入向量的表。column_to_search:必填。指定基础表中用于搜索最近邻嵌入向量的列名。query_table | (query_table_query):必填。提供待查找最近邻嵌入向量的表。query_column_to_search:必填。指定查询表中包含待查找最近邻嵌入向量的列名。top_k:必填。指定要返回的最近邻的数量。必须是一个正整数(即 ≥ 1)。distance_type:选填。指定用于计算两个向量之间距离的度量类型。支持以下类型:cosine:余弦相似度,用于衡量两个向量方向的相似性(常用于文本、图像特征向量等场景)。euclidean(默认值):欧几里得距离,表示两个向量在空间中的直线距离。dot_product:点积(内积),适用于已归一化的向量,值越大表示相似度越高。
options:选填。JSON格式的字符串,其他可配置参数。如:use_brute_force:一个JSON布尔值,用于确定是否使用暴力搜索(即跳过可用的向量索引)。例如, '{"use_brute_force":true}'。默认值为false。如果指定use_brute_force=false且没有可用的向量索引,系统仍会自动采用暴力搜索。
返回值说明
对于查询数据中的每一行,输出结果包含满足搜索条件的基表中的多行数据。每个查询行返回的结果行数等于 top_k 指定值。输出的顺序不保证。
query:一个包含查询数据中所有选定列的STRUCT值。仅当使用批量搜索语法时,此列才会包含在输出中。对于单向量搜索,此列将被省略。
base:一个STRUCT值,其中包含base_table中的所有列,或者是在base_table_query查询中选择的base_table中的部分列。
distance:一个DOUBLE类型的值,表示base data 和query data之间的距离。
使用示例
数据准备
-- 开启VECTOR数据类型
set odps.sql.type.vector.enable=true;
set odps.sql.type.system.odps2=true;
-- 创建用于搜索最近邻嵌入向量的表,并插入数据
CREATE OR REPLACE TABLE base_table
(
id STRING,
my_embedding VECTOR(FLOAT,2)
)
TBLPROPERTIES (
"table.format.version"="2"
);
INSERT into base_table (id, my_embedding)
VALUES('dog', CAST(array(1.0, 2.0) AS VECTOR(FLOAT,2))),
('wolf', CAST(array(2.0, 4.0) AS VECTOR(FLOAT,2))),
('snake', CAST(array(-2.0, 3.0) AS VECTOR(FLOAT,2))),
('lion', CAST(array(2.0, -2.5) AS VECTOR(FLOAT,2))),
('tiger', CAST(array(3.0, -2.0) AS VECTOR(FLOAT,2))),
('otter', CAST(array(-3.0, -1.0) AS VECTOR(FLOAT,2))),
('whale', CAST(array(-5.0, -1.0) AS VECTOR(FLOAT,2)));
-- 创建用于提供待查找最近邻嵌入向量的表,并插入数据
CREATE OR REPLACE TABLE query_table
(
query_id STRING,
embedding VECTOR(FLOAT,2)
)TBLPROPERTIES (
"table.format.version"="2"
);
INSERT INTO query_table (query_id, embedding)
VALUES('dog', CAST(array(1.0, 2.0) AS VECTOR(FLOAT,2))),
('cat', CAST(array(1.0, -1.0) AS VECTOR(FLOAT,2)));以下示例在 base_table 表的 my_embedding 列中进行搜索,为 query_table 表 embedding 列中的每一行数据找出最匹配的两个向量(Top 2)。
SELECT *
FROM
VECTOR_SEARCH(
TABLE base_table,
my_embedding,
(SELECT query_id, embedding FROM query_table),
embedding,
2);
-- 返回结果:
+----------+-----------+----+--------------+------------+
| query_id | embedding | id | my_embedding | distance |
+----------+-----------+----+--------------+------------+
| dog | [1, 2] | dog | [1, 2] | 0.0 |
| dog | [1, 2] | wolf | [2, 4] | 5.0 |
| cat | [1, -1] | lion | [2, -2.5] | 3.25 |
| cat | [1, -1] | tiger | [3, -2] | 5.0 |
+----------+-----------+----+--------------+------------+