共用方式為

vector_search 函数

适用于:勾选“是” Databricks SQL

重要

此功能目前以公共预览版提供。

使用 vector_search() 函数,可以使用 SQL 查询 Mosaic AI 矢量搜索索引。

要求

语法

在 Databricks Runtime 15.3 及更高版本中,使用 query_textquery_vector 指定要在索引中搜索的内容。

SELECT * FROM vector_search(
  index,
  { query_text | query_vector },
  [ num_results ]
)

在 Databricks Runtime 15.2 及更低版本中,用于 query 指定要在索引中搜索的内容。

SELECT * FROM vector_search(
  index, query, num_results
)

参数

所有参数都必须按名称传递,例如vector_search(index => indexName, query_text => queryText)

  • indexSTRING常量,同一工作区中现有矢量搜索索引的完全限定名称,用于调用。 定义者必须具有 Select 对索引的权限。

  • 使用以下项之一指定要在索引中搜索的表达式:

    • 对于 Databricks Runtime 15.3 或更高版本,使用 query_text 在 Delta Sync Index 的嵌入源列中搜索特定文本字符串。 查询必须是一个用于在索引中搜索字符串的 STRING 表达式。
    • 对于 Databricks Runtime 15.3 或更高版本,使用 query_vector 在 Delta 同步索引的嵌入矢量列中搜索特定矢量。 当使用自管理矢量搜索增量同步索引时,需要此参数。 查询必须是索引中需要搜索的嵌入矢量的ARRAY<FLOAT>ARRAY<DOUBLE>ARRAY<DECIMAL(_, _)>表达式。
    • 在 Databricks Runtime 15.2 或更低版本中,使用 query 指定要在索引中搜索的字符串。
  • num_results(可选):整数常量,要返回的最大记录数。 默认值为 10。

  • query_type(可选):要对矢量搜索索引执行的搜索类型。 默认为 ANN 未显式指定。

    • query_type ANN 如果是,则必须指定或query_textquery_vector必须指定以执行近似近邻搜索或相似性搜索。
    • 如果为query_typeHYBRIDquery_text则必须指定。 可以同时 query_text 指定混合搜索和 query_vector 混合搜索。 此实例中的混合搜索意味着相似性搜索和关键字搜索的组合,其中关键字搜索使用文本文本作为目标。

下表总结了在使用嵌入模型使用 Delta Sync 索引时 可以使用哪些参数:

query_type query_text query_vector Description
ANN (也称为近似近邻或相似性搜索)
  • 对于特定文本或矢量字符串的相似性搜索,可以指定 query_text
  • 嵌入可以自动计算 query_text,并用于相似性搜索,因此无需指定 query_vector
ANN (也称为近似近邻或相似性搜索) 用于 query_vector 相似性搜索。
混合
  • 用于 query_text 关键字搜索。 关键字搜索使用文本文本作为目标,因此 query_text 是必需的。
  • 嵌入可以自动计算 query_text,并用于相似性搜索,因此无需指定 query_vector
混合 用于 query_text 关键字搜索,并用于 query_vector 相似性搜索。

下表描述了在不使用嵌入模型的情况下使用 Delta 同步索引时 可以使用的不同方案和参数:

query_type query_text query_vector Description
ANN (也称为近似近邻或相似性搜索) 用于query_vector 相似性搜索。 相似性搜索需要嵌入矢量作为搜索目标。 由于此方案中不提供嵌入模型来计算嵌入向量,因此必须提供该模型。
混合 对于特定文本字符串和矢量的混合搜索,请同时指定 query_textquery_vector

返回

索引中排名靠前的匹配记录的表。 包含索引的所有列。

示例

以下部分显示不同索引搜索的示例 SQL 查询。

混合搜索查询

以下混合搜索示例合并了以下搜索类型,以在矢量搜索索引的文本或元数据中查找提供的字词:

  • 矢量相似性搜索:查找类似语义含义 Wi-Fi issues
  • 关键字搜索:查找 Wi-Fi issues LMP-9R2 关键字索引。
SELECT * FROM vector_search(
  index => 'main.support_docs.index',
  query_text => 'Wi-Fi issues LMP-9R2',
  query_type => 'HYBRID',
  num_results => 3)
doc_id title product_code
1403 Wi-Fi 故障排除指南 - LMP-9R2 LMP-9R2
1332 LMP-9R2 设备的已知连接问题 LMP-9R2
1271 常规 Wi-Fi 故障排除指南 LMP-8R2

下面的混合搜索示例同时指定 query_text 术语和 query_vector 术语 Wi-Fi issues LMP-9R2。 在此示例中,关键字搜索对公司特有的专有术语(如在本例中为“LMP-9R2”)表现更好,而通常在公共数据集上训练的矢量搜索无法识别类似于“LMP-9R2”的术语。


SELECT * FROM vector_search(
  index => 'main.support_docs.index',
  query_text => 'Wi-Fi issues LMP-9R2',
  query_vector => array( 0.0213, 0.1045, 0.0871, 0.0562, 0.1459, ... 0.0131),-- a self computed embedding of the `query_text` param
  query_type => 'HYBRID',
  num_results => 3 )

doc_id title product_code
1403 Wi-Fi 故障排除指南 - LMP-9R2 LMP-9R2
1332 LMP-9R2 设备的已知连接问题 LMP-9R2
1271 常规 Wi-Fi 故障排除指南 LMP-8R2

使用嵌入源列对索引进行文本查询

搜索产品 SKU 的索引,以按名称查找类似产品。 以下示例使用 query_text,该代码仅在 Databricks Runtime 15.3 及更高版本中受支持。 对于 Databricks Runtime 15.2 及更低版本,请使用 query 而不是 query_text


SELECT * FROM VECTOR_SEARCH(index => "main.db.my_index", query_text => "iphone", num_results => 2)
ID 产品名称
10 iPhone
20 iPhone SE

以下示例使用 LATERAL 子查询同时搜索多个词。


SELECT
  query_txt,
  query_id,
  search.*
FROM
  query_table,
  LATERAL(
SELECT * FROM VECTOR_SEARCH(index => "main.db.my_index", query_text => query_txt, num_results => 2)
  ) as search
query_txt query_id search.id search.product_name
iphone 1 10 iPhone 10
iphone 1 20 iPhone SE
Pixel 8 2 30 像素 8
Pixel 8 2 40 像素 8a

使用嵌入源列对索引进行文本查询

使用预先计算的嵌入搜索图像索引,以通过嵌入查找类似图像。 以下示例使用 query_vector,该代码仅在 Databricks Runtime 15.3 及更高版本中受支持。 对于 Databricks Runtime 15.2 及更低版本,请使用 query 而不是 query_vector


SELECT * FROM VECTOR_SEARCH(index => "main.db.my_index", query_vector => ARRAY(0.45, -0.35, 0.78, 0.22), num_results => 3)

SELECT * FROM VECTOR_SEARCH(index => "main.db.my_index", query_vector => ARRAY(0.45F, -0.35F, 0.78F, 0.22F), num_results => 3)

SELECT * FROM VECTOR_SEARCH(index => "main.db.my_index", query_vector => ARRAY(0.45D, -0.35D, 0.78D, 0.22D), num_results => 3)
id 图像名称 image_embedding
28 horse.jpg [0.46, -0.34, 0.77, 0.21]
二十七 donkey.jpg [0.44, -0.36, 0.79, 0.23]
5 elk.jpg [0.23, -0.44, 0.77, 0.80]

以下示例使用 LATERAL 子查询同时搜索多个词。


SELECT
  query_embedding,
  search.*
FROM
  query_table,
  LATERAL(
SELECT * FROM VECTOR_SEARCH(index => "main.db.my_index", query_vector => image_embedding, num_results => 1)
  ) as search
query_embedding search.id search.image_name search_image_embedding
[0.45, -0.35, 0.78, 0.22] 二十七 donkey.jpg [0.46, -0.34, 0.77, 0.21]
[0.14, 0.29, 0.30, -0.90] 3 landscape.jpg [0.15, 0.30, 0.31, -0.91]
[0.23, -0.44, 0.77, 0.80] 10 golden_gate_bridge.jpg [0.28, -0.40, 0.23, 0.81]
[0.88, 0.88, 0.88, 0.88] 44 blank.jpg [0.88, 0.88, 0.88, 0.88]

限制

预览期间存在以下限制:

  • 不支持查询DIRECT_ACCESS索引类型。
  • 不支持输入参数filters_jsoncolumns
  • 不支持num_results 大于 100 的矢量搜索。
  • vector_search 不能与使用 Foundation Model API 预置吞吐量的模型服务终结点一起使用。