本文介绍了如何通过 VECTOR_SEARCH 函数使用向量搜索的功能。向量搜索允许根据给定的高维数字向量以查找语义上最相似的项。
使用限制
-
实时计算Flink版VVR引擎11.3及以上版本支持流模式,11.4及以上版本支持批模式。
-
支持Milvus和DLF Paimon(VVR 11.8及以上版本)作为向量表进行搜索。
-
仅支持处理非更新流(只包含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 采用 DOUBLE 类型描述了输入数据与输出的数据的相似度。
运行参数
|
参数 |
数据类型 |
默认值 |
说明 |
|
async |
Boolean |
(none) |
是否启用 async 模式。如果向量表使用的 connector 不支持指定的模式,引擎会报错告知用户。 默认情况下,引擎会根据连接器支持的模式来选择执行模式。若连接器同时支持异步和同步模式,引擎优先使用异步模式提升整体的吞吐。 |
|
max-concurrent-operations |
Integer |
10 |
异步模式下,最大并行请求数。 |
|
output-mode |
Enum |
|
异步操作的输出模式。 可能的取值:
关于两个取值的含义,请参考Async I/O。 |
|
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" |