适用于:
Databricks SQL
重要说明
此功能目前以公共预览版提供。
使用vector_search()函数,可以使用 SQL 查询Mosaic AI 矢量搜索索引。
要求
- 此函数在经典 SQL 仓库中不可用。
- 有关详细信息,请参阅Databricks 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_typeANN如果是,则必须指定或query_textquery_vector必须指定以执行近似近邻搜索或相似性搜索。 - 如果为
query_typeHYBRID,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 |
| 像素 8 | 2 | 30 | 像素 8 |
| 像素 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 预置吞吐量的模型服务终结点一起使用。