本文介绍了如何通过 VECTOR_SEARCH 函数使用向量搜索的功能。向量搜索允许根据给定的高维数字向量以查找语义上最相似的项。
使用限制
仅实时计算Flink版VVR引擎 11.3及以上版本支持。
仅支持 Milvus 作为向量表进行搜索。
仅支持处理非更新流(只包含INSERT类型消息的称为非更新流)。
仅支持在流模式下运行,目前不支持批模式运行。
语法
VECTOR_SEARCH(
TABLE <SEARCH_TABLE>,
DESCRIPTOR(<COLUMN_TO_SEARCH>),
<COLUMN_TO_QUERY>,
<TOP_K>[,
<CONFIG>]
)
入参
参数 | 数据类型 | 说明 |
TABLE <SEARCH_TABLE> | TABLE | 向量表的表名。 |
DESCRIPTOR(<COLUMN_TO_SEARCH>) | DESC | 向量表中建立索引的向量列。输入数据将会跟指定的向量列比较,并计算相似度。 |
COLUMN_TO_QUERY | ARRAY<FLOAT>/ARRAY<DOUBLE> | 输入中的向量特征列(例如用户上传的图像/文本的嵌入向量),并与建立索引的向量列进行相似度匹配。 |
TOP_K | INT | 输出相似数据的最大条数。 |
CONFIG | MAP<STRING,STRING> | 可配置的运行参数。 |
返回
VECTOR_SEARCH 的返回是一张数据表。其中,每个 ROW 的结果都包含了向量表中的所有列以及一个额外的附加列 score。该附加列 score 采用 DUOBLE 类型描述了输入数据与输出的数据的相似度。
运行参数
参数 | 数据类型 | 默认值 | 说明 |
async | Boolean | (none) | 是否启用 async 模式。如果向量表使用的 connector 不支持指定的模式,引擎会报错告知用户。 默认情况下,引擎会根据连接器支持的模式来选择执行模式。若连接器同时支持异步和同步模式,引擎优先使用异步模式提升整体的吞吐。 |
max-concurrent-operations | Integer | 10 | 异步模式下,最大并行请求数。 |
output-mode | Enum |
| 异步操作的输出模式。 可能的取值:
关于两个取值的含义,请参考文档。 |
timeout | Duration | 3min | 从首次调用到异步操作最终完成的超时时间,可能包含多次重试,并且在发生故障转移(failover)时会被重置。 |
示例
测试数据
假设向量表 vector_table
中有如下数据:
id | topic | vector_index |
1 | "BigData" | [1, 1, 0] |
2 | "Streaming" | [-5, -12, -13] |
3 | "Batch" | [5, 12, 13] |
若查询数据表 query_table
中存有如下数据:
id | user_keyword | embedding |
1 | "Spark" | [5, 12, 13] |
2 | "Flink" | [-5, -12, -13] |
测试语句
通过以下 SQL 为 query_table
中的每条数据搜索vector_table
获取相似度前2的数据。
SELECT user_keyword, topic
FROM
query_table,
LATERAL TABLE (VECTOR_SEARCH(
SEARCH_TABLE => TABLE vector_table,
COLUMN_TO_SEARCH => DESCRIPTOR(vector_index),
COLUMN_TO_QUERY => query_table.embedding,
TOP_K => 2,
MAP['async', 'false'] -- 开启同步模式
))
输出结果
user_keyword | topic |
"Spark" | "Batch" |
"Spark" | "BigData" |
"Flink" | "Streaming" |
"Flink" | "BigData" |