📣

TiDB Cloud Serverless 现已更名为
TiDB Cloud Starter
!体验不变,名字焕新。
立即试用 →

向量函数和操作符

本文介绍 TiDB 支持的向量函数和操作符。

向量函数

TiDB 为向量数据类型引入了以下向量函数:

向量距离函数:

函数名描述向量索引是否支持该函数
VEC_L2_DISTANCE计算两个向量之间的 L2 距离 (欧氏距离)
VEC_COSINE_DISTANCE计算两个向量之间的余弦距离
VEC_NEGATIVE_INNER_PRODUCT计算两个向量内积的负数
VEC_L1_DISTANCE计算两个向量之间的 L1 距离 (曼哈顿距离)

其他向量函数:

函数名描述
VEC_DIMS计算向量的维度
VEC_L2_NORM计算向量的 L2 范数 (欧氏规范)
VEC_FROM_TEXT将字符串类型转换为向量类型
VEC_AS_TEXT将向量类型转换为字符串类型

扩展的内置函数和运算符

TiDB 扩展了以下内置函数和运算符的功能,使其额外支持了向量数据类型

算术运算符:

运算符描述
+向量以元素为单位进行加法运算符
-向量以元素为单位进行减法运算符

关于向量运算工作原理的更多信息,请参阅向量数据类型的运算

聚合函数 (GROUP BY):

函数名描述
COUNT()返回行数
COUNT(DISTINCT)返回不同值的行数
MAX()返回最大值
MIN()返回最小值

比较函数与操作符:

名称描述
BETWEEN ... AND ...检查值是否在某个取值范围内
COALESCE()获得第一个非 NULL 参数
=相等比较符
<=>安全的 NULL 相等比较符
>大于运算符
>=大于或等于运算符
GREATEST()返回最大参数
IN()检查值是否在一组数值之内
IS NULL判断是否为 NULL
ISNULL()判断参数是否为 NULL
LEAST()返回最小参数
<小于运算符
<=小于或等于运算符
NOT BETWEEN ... AND ...检查值是否不在某个取值范围内
!=, <>不等运算符
NOT IN()检查值是否不在一组数值之内

关于如何比较向量的更多信息,请参阅向量数据类型的比较

控制流程函数:

函数名描述
CASECase 操作符
IF()构建 If/else
IFNULL()构建 Null if/else
NULLIF()如果 expr1 = expr2,返回 NULL

转换函数:

函数名描述
CAST()将值转换为字符串或向量类型
CONVERT()将值转换为字符串类型

关于如何使用 CAST() 的更多信息,请参阅向量数据类型的转换

使用示例

VEC_L2_DISTANCE

VEC_L2_DISTANCE(vector1, vector2)

计算两个向量之间的 L2 距离 (欧式距离),使用的公式为:

DISTANCE(p,q)=i=1n(piqi)2DISTANCE(p,q)=\sqrt {\sum \limits _{i=1}^{n}{(p_{i}-q_{i})^{2}}}

参与计算的两个向量的维数必须相同。当两个向量的维数不同时,TiDB 将返回错误信息。

示例:

SELECT VEC_L2_DISTANCE('[0, 3]', '[4, 0]');
+-------------------------------------+ | VEC_L2_DISTANCE('[0, 3]', '[4, 0]') | +-------------------------------------+ | 5 | +-------------------------------------+

VEC_COSINE_DISTANCE

VEC_COSINE_DISTANCE(vector1, vector2)

计算两个向量之间的余弦 (cosine) 距离,使用的公式为:

DISTANCE(p,q)=1.0i=1npiqii=1npi2i=1nqi2DISTANCE(p,q)=1.0 - {\frac {\sum \limits _{i=1}^{n}{p_{i}q_{i}}}{{\sqrt {\sum \limits _{i=1}^{n}{p_{i}^{2}}}}\cdot {\sqrt {\sum \limits _{i=1}^{n}{q_{i}^{2}}}}}}

参与计算的两个向量的维数必须相同。当两个向量的维数不同时,TiDB 将返回错误信息。

对于 OpenAI 的 embedding,建议使用此函数。

示例:

SELECT VEC_COSINE_DISTANCE('[1, 1]', '[-1, -1]');
+-------------------------------------------+ | VEC_COSINE_DISTANCE('[1, 1]', '[-1, -1]') | +-------------------------------------------+ | 2 | +-------------------------------------------+

VEC_NEGATIVE_INNER_PRODUCT

VEC_NEGATIVE_INNER_PRODUCT(vector1, vector2)

计算两个向量之间内积的负值,使用的公式为:

DISTANCE(p,q)=INNER_PROD(p,q)=i=1npiqiDISTANCE(p,q)=- INNER\_PROD(p,q)=-\sum \limits _{i=1}^{n}{p_{i}q_{i}}

参与计算的两个向量的维数必须相同。当两个向量的维数不同时,TiDB 将返回错误信息。

示例:

SELECT VEC_NEGATIVE_INNER_PRODUCT('[1, 2]', '[3, 4]');
+------------------------------------------------+ | VEC_NEGATIVE_INNER_PRODUCT('[1, 2]', '[3, 4]') | +------------------------------------------------+ | -11 | +------------------------------------------------+

VEC_L1_DISTANCE

VEC_L1_DISTANCE(vector1, vector2)

计算两个向量之间的 L1 距离(曼哈顿距离),使用的公式为:

DISTANCE(p,q)=i=1npiqiDISTANCE(p,q)=\sum \limits _{i=1}^{n}{|p_{i}-q_{i}|}

参与计算的两个向量的维数必须相同。当两个向量的维数不同时,TiDB 将返回错误信息。

示例:

SELECT VEC_L1_DISTANCE('[0, 0]', '[3, 4]');
+-------------------------------------+ | VEC_L1_DISTANCE('[0, 0]', '[3, 4]') | +-------------------------------------+ | 7 | +-------------------------------------+

VEC_DIMS

VEC_DIMS(vector)

返回向量的维度。

示例:

SELECT VEC_DIMS('[1, 2, 3]');
+-----------------------+ | VEC_DIMS('[1, 2, 3]') | +-----------------------+ | 3 | +-----------------------+
SELECT VEC_DIMS('[]');
+----------------+ | VEC_DIMS('[]') | +----------------+ | 0 | +----------------+

VEC_L2_NORM

VEC_L2_NORM(vector)

计算向量的 L2 范数(欧几里得范数),使用的公式为:

NORM(p)=i=1npi2NORM(p)=\sqrt {\sum \limits _{i=1}^{n}{p_{i}^{2}}}

示例:

SELECT VEC_L2_NORM('[3, 4]');
+-----------------------+ | VEC_L2_NORM('[3, 4]') | +-----------------------+ | 5 | +-----------------------+

VEC_FROM_TEXT

VEC_FROM_TEXT(string)

将字符串类型转换为向量类型。在许多情况下(例如当向 VECTOR 数据类型的列中插入数据时),这种转换是隐式完成的。然而,在不支持隐式转换的表达式(例如对向量的算术运算)中,你需要显式调用该函数。

示例:

SELECT VEC_FROM_TEXT('[1, 2]') + VEC_FROM_TEXT('[3, 4]');
+-------------------------------------------------+ | VEC_FROM_TEXT('[1,2]') + VEC_FROM_TEXT('[3,4]') | +-------------------------------------------------+ | [4,6] | +-------------------------------------------------+

VEC_AS_TEXT

VEC_AS_TEXT(vector)

将向量类型转换为字符串类型。

示例:

SELECT VEC_AS_TEXT('[1.000, 2.5]');
+-----------------------------+ | VEC_AS_TEXT('[1.000, 2.5]') | +-----------------------------+ | [1,2.5] | +-----------------------------+

MySQL 兼容性

向量函数、有关向量的内置函数和向量数据类型运算符只在 TiDB 中支持,MySQL 不支持。

另请参阅

文档内容是否有帮助?