适用于:SQL Server 2025 (17.x) 预览版
使用近似相邻向量搜索算法搜索类似于给定查询矢量的矢量。 若要详细了解矢量索引和矢量搜索的工作原理,以及精确搜索和近似搜索之间的差异,请参阅 SQL 数据库引擎中的矢量搜索和矢量索引。
预览功能
此函数处于预览状态,可能会更改。 若要使用此功能,必须启用 PREVIEW_FEATURES数据库范围的配置。
在使用之前,请确保先查看 当前限制 。
Syntax
VECTOR_SEARCH(
TABLE = object [ AS source_table_alias ]
, COLUMN = vector_column
, SIMILAR_TO = query_vector
, METRIC = { 'cosine' | 'dot' | 'euclidean' }
, TOP_N = k
) [ AS result_table_alias ]
Arguments
TABLE = 对象 [AS source_table_alias]
执行搜索的表。 它必须是基表。 不支持视图、临时表(本地表和全局表)。
COLUMN = vector_column
在其中执行搜索的向量列。 该列必须是 矢量 数据类型。
SIMILAR_TO = query_vector
用于搜索的向量。 它必须是 矢量 类型的变量或列。
METRIC = { 'cosine' |'dot' |'euclidean' }
用于计算查询向量与指定列中矢量之间的距离的距离指标。 仅当找到与同一个指标和同一列匹配的 ANN 索引时,才使用 ANN(近似近邻)索引。 如果没有兼容的 ANN 索引,则会引发警告,并使用 KNN (k-Nearest Neighbor) 算法。
TOP_N = <k>
必须返回的最大相似向量数。 它必须是正 整数。
result_table_alias
别名用于引用结果集。
返回结果集
函数返回 VECTOR_SEARCH 的结果集包括:
- 参数中指定的
TABLE表中的所有列。 - 一个名为
distance的另一列,表示参数指定的COLUMN列中向量与参数中SIMILAR_TO提供的向量之间的距离。
距离列由 VECTOR_SEARCH 函数本身生成,而所有其他列都来自参数中引用的 TABLE 表。
如果使用参数中表的 TABLE 别名,则必须使用相同的别名来引用语句中的 SELECT 列。 不能使用分配给 VECTOR_SEARCH 引用表中指定 TABLE列的别名。 如果认为通过获取表数据的输出 VECTOR_SEARCH 并合并结果集,可以更轻松地理解此行为。
如果参数中指定的 TABLE 表已包含一 distance个名为列,该行为将类似于两个共享列名称的表之间的 SQL 联接。 在这种情况下,必须使用表别名来消除列引用的歧义,否则将引发错误。
Limitations
当前预览版具有以下限制:
仅筛选后
矢量搜索在应用任何谓词之前发生。 仅当返回最相似的向量后,才会应用其他谓词。 下面的示例返回与查询向量 @qv最相似的嵌入的前 10 行,然后应用子句中指定的 WHERE 谓词。 如果与矢量搜索返回的向量关联的 10 行中没有等于 accepted 1 的列,则结果为空。
SELECT TOP (10) s.id,
s.title,
r.distance
FROM VECTOR_SEARCH(
TABLE = dbo.sessions AS s,
COLUMN = embedding,
SIMILAR_TO = @qv,
METRIC = 'cosine',
TOP_N = 10
) AS r
WHERE accepted = 1
ORDER BY r.distance;
无法在视图中使用VECTOR_SEARCH
VECTOR_SEARCH 不能在视图正文中使用。
Examples
示例 1
以下示例查找表中最相似的 10 篇文章Pink Floyd music stylewikipedia_articles_embeddings。
DECLARE @qv VECTOR(1536) = AI_GENERATE_EMBEDDING(N'Pink Floyd music style' USE MODEL Ada2Embeddings);
SELECT TOP (10) s.id,
s.title,
r.distance
FROM VECTOR_SEARCH(
TABLE = [dbo].[wikipedia_articles_embeddings] as t,
COLUMN = [content_vector],
SIMILAR_TO = @qv,
METRIC = 'cosine',
TOP_N = 10
) AS s
ORDER BY s.distance
示例 2
与示例 1 相同,但这次查询向量是从另一个表而不是变量中获取的。
CREATE TABLE #t
(
id INT,
q NVARCHAR (MAX),
v VECTOR(1536)
);
INSERT INTO #t
SELECT id,
q,
AI_GENERATE_EMBEDDINGS(q USE MODEL Ada2Embeddings)
FROM (VALUES
(1, N'four legged furry animal'),
(2, N'pink floyd music style')
) S(id, q);
SELECT TOP (10) t.id,
s.distance,
t.title
FROM #t AS qv
CROSS APPLY
VECTOR_SEARCH(
TABLE = [dbo].[wikipedia_articles_embeddings] AS t,
COLUMN = [content_vector],
SIMILAR_TO = qv.v,
METRIC = 'cosine',
TOP_N = 10
) AS s
WHERE qv.id = 2
ORDER BY s.distance;
示例 3
使用和相关CREATE VECTOR INDEX函数的基本端到端示例VECTOR_SEARCH。 将模拟嵌入内容。 在实际方案中,嵌入使用嵌入模型和 AI_GENERATE_EMBEDDINGS或 OpenAI SDK 等外部库生成。
以下代码块演示 VECTOR_SEARCH 了具有模拟嵌入的函数:
- 启用当前预览版中必需的跟踪标志。
- 使用数据类型
dbo.Articles的列embedding创建示例表。 - 使用模拟嵌入数据插入示例数据。
- 在 . 上
dbo.Articles.embedding创建向量索引。 - 使用函数演示矢量相似性搜索
VECTOR_SEARCH。
-- Step 0: Enable Preview Feature
ALTER DATABASE SCOPED CONFIGURATION
SET PREVIEW_FEATURES = ON;
GO
-- Step 1: Create a sample table with a VECTOR(5) column
CREATE TABLE dbo.Articles
(
id INT PRIMARY KEY,
title NVARCHAR(100),
content NVARCHAR(MAX),
embedding VECTOR(5) -- mocked embeddings
);
GO
-- Step 2: Insert sample data
INSERT INTO Articles (id, title, content, embedding)
VALUES
(1, 'Intro to AI', 'This article introduces AI concepts.', '[0.1, 0.2, 0.3, 0.4, 0.5]'),
(2, 'Deep Learning', 'Deep learning is a subset of ML.', '[0.2, 0.1, 0.4, 0.3, 0.6]'),
(3, 'Neural Networks', 'Neural networks are powerful models.', '[0.3, 0.3, 0.2, 0.5, 0.1]'),
(4, 'Machine Learning Basics', 'ML basics for beginners.', '[0.4, 0.5, 0.1, 0.2, 0.3]'),
(5, 'Advanced AI', 'Exploring advanced AI techniques.', '[0.5, 0.4, 0.6, 0.1, 0.2]');
GO
-- Step 3: Create a vector index on the embedding column
CREATE VECTOR INDEX vec_idx ON Articles(embedding)
WITH (METRIC = 'cosine', TYPE = 'diskann');
GO
-- Step 4: Perform a vector similarity search
DECLARE @qv VECTOR(5) = '[0.3, 0.3, 0.3, 0.3, 0.3]';
SELECT TOP(3)
t.id,
t.title,
t.content,
s.distance
FROM
VECTOR_SEARCH(
TABLE = Articles AS t,
COLUMN = embedding,
SIMILAR_TO = @qv,
METRIC = 'cosine',
TOP_N = 3
) AS s
ORDER BY s.distance, t.title;