VECTOR_SEARCH

本文介绍了如何通过 VECTOR_SEARCH 函数使用向量搜索的功能。向量搜索允许根据给定的高维数字向量以查找语义上最相似的项。

使用限制

  • 仅实时计算FlinkVVR引擎 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

ORDERED

异步操作的输出模式。

可能的取值:

  • ORDERED

  • ALLOW_UNORDERED

关于两个取值的含义,请参考文档

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"