适用于: Databricks SQL
重要
此功能目前以公共预览版提供。
使用 vector_search()
函数,可以使用 SQL 查询 Mosaic AI 矢量搜索索引。
要求
此函数在经典 SQL 仓库中不可用。
此函数已在支持 Mosaic AI 矢量搜索的区域开放。
语法
在 Databricks Runtime 15.3 及更高版本中,使用 query_text
或 query_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)
。
index
:STRING
常量,同一工作区中现有矢量搜索索引的完全限定名称,用于调用。 定义者必须具有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
指定要在索引中搜索的字符串。
- 对于 Databricks Runtime 15.3 或更高版本,使用
num_results
(可选):整数常量,要返回的最大记录数。 默认值为 10。query_type
(可选):要对矢量搜索索引执行的搜索类型。 默认为ANN
未显式指定。-
query_type
ANN
如果是,则必须指定或query_text
query_vector
必须指定以执行近似近邻搜索或相似性搜索。 - 如果为
query_type
HYBRID
,query_text
则必须指定。 可以同时query_text
指定混合搜索和query_vector
混合搜索。 此实例中的混合搜索意味着相似性搜索和关键字搜索的组合,其中关键字搜索使用文本文本作为目标。
-
下表总结了在使用嵌入模型使用 Delta Sync 索引时 可以使用哪些参数:
query_type |
query_text |
query_vector |
Description |
---|---|---|---|
ANN (也称为近似近邻或相似性搜索) | ✓ |
|
|
ANN (也称为近似近邻或相似性搜索) | ✓ | 用于 query_vector 相似性搜索。 |
|
混合 | ✓ |
|
|
混合 | ✓ | ✓ | 用于 query_text 关键字搜索,并用于 query_vector 相似性搜索。 |
下表描述了在不使用嵌入模型的情况下使用 Delta 同步索引时 可以使用的不同方案和参数:
query_type |
query_text |
query_vector |
Description |
---|---|---|---|
ANN (也称为近似近邻或相似性搜索) |
✓ | 用于query_vector 相似性搜索。 相似性搜索需要嵌入矢量作为搜索目标。 由于此方案中不提供嵌入模型来计算嵌入向量,因此必须提供该模型。 |
|
混合 | ✓ | ✓ | 对于特定文本字符串和矢量的混合搜索,请同时指定 query_text 和 query_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_json
或columns
。 - 不支持
num_results
大于 100 的矢量搜索。 -
vector_search
不能与使用 Foundation Model API 预置吞吐量的模型服务终结点一起使用。