VECTOR_SEARCH

更新时间:
复制 MD 格式

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_tableembedding 列中的每一行数据找出最匹配的两个向量(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        |
+----------+-----------+----+--------------+------------+