title | summary |
---|---|
向量函数和操作符 |
本文介绍 TiDB 的向量相关函数和操作。 |
本文介绍 TiDB 支持的向量函数和操作符。
警告:
该功能目前为实验特性,不建议在生产环境中使用。该功能可能会在未事先通知的情况下发生变化。如果发现 bug,请在 GitHub 上提 issue 反馈。
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() |
检查值是否不在一组数值之内 |
关于如何比较向量的更多信息,请参阅向量数据类型的比较。
控制流程函数:
函数名 | 描述 |
---|---|
CASE |
Case 操作符 |
IF() |
构建 If/else |
IFNULL() |
构建 Null if/else |
NULLIF() |
如果 expr1 = expr2,返回 NULL |
转换函数:
函数名 | 描述 |
---|---|
CAST() |
将值转换为字符串或向量类型 |
CONVERT() |
将值转换为字符串类型 |
关于如何使用 CAST()
的更多信息,请参阅向量数据类型的转换。
VEC_L2_DISTANCE(vector1, vector2)
计算两个向量之间的 L2 距离 (欧式距离),使用的公式为:
$DISTANCE(p,q)=\sqrt {\sum \limits {i=1}^{n}{(p{i}-q_{i})^{2}}}$
参与计算的两个向量的维度必须相同。当两个向量的维度不同时,TiDB 将返回错误信息。
示例:
[tidb]> SELECT VEC_L2_DISTANCE('[0,3]', '[4,0]');
+-----------------------------------+
| VEC_L2_DISTANCE('[0,3]', '[4,0]') |
+-----------------------------------+
| 5 |
+-----------------------------------+
VEC_COSINE_DISTANCE(vector1, vector2)
计算两个向量之间的余弦 (cosine) 距离,使用的公式为:
$DISTANCE(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 将返回错误信息。
示例:
[tidb]> SELECT VEC_COSINE_DISTANCE('[1, 1]', '[-1, -1]');
+-------------------------------------------+
| VEC_COSINE_DISTANCE('[1, 1]', '[-1, -1]') |
+-------------------------------------------+
| 2 |
+-------------------------------------------+
VEC_NEGATIVE_INNER_PRODUCT(vector1, vector2)
计算两个向量之间内积的负值,使用的公式为:
$DISTANCE(p,q)=- INNER_PROD(p,q)=-\sum \limits {i=1}^{n}{p{i}q_{i}}$
参与计算的两个向量的维度必须相同。当两个向量的维度不同时,TiDB 将返回错误信息。
示例:
[tidb]> SELECT VEC_NEGATIVE_INNER_PRODUCT('[1,2]', '[3,4]');
+----------------------------------------------+
| VEC_NEGATIVE_INNER_PRODUCT('[1,2]', '[3,4]') |
+----------------------------------------------+
| -11 |
+----------------------------------------------+
VEC_L1_DISTANCE(vector1, vector2)
计算两个向量之间的 L1 距离(曼哈顿距离),使用的公式为:
$DISTANCE(p,q)=\sum \limits {i=1}^{n}{|p{i}-q_{i}|}$
参与计算的两个向量的维度必须相同。当两个向量的维度不同时,TiDB 将返回错误信息。
示例:
[tidb]> SELECT VEC_L1_DISTANCE('[0,0]', '[3,4]');
+-----------------------------------+
| VEC_L1_DISTANCE('[0,0]', '[3,4]') |
+-----------------------------------+
| 7 |
+-----------------------------------+
VEC_DIMS(vector)
返回向量的维度。
示例:
[tidb]> SELECT VEC_DIMS('[1,2,3]');
+---------------------+
| VEC_DIMS('[1,2,3]') |
+---------------------+
| 3 |
+---------------------+
[tidb]> SELECT VEC_DIMS('[]');
+----------------+
| VEC_DIMS('[]') |
+----------------+
| 0 |
+----------------+
VEC_L2_NORM(vector)
计算向量的 L2 范数(欧几里得范数),使用的公式为:
$NORM(p)=\sqrt {\sum \limits {i=1}^{n}{p{i}^{2}}}$
示例:
[tidb]> SELECT VEC_L2_NORM('[3,4]');
+----------------------+
| VEC_L2_NORM('[3,4]') |
+----------------------+
| 5 |
+----------------------+
VEC_FROM_TEXT(string)
将字符串类型转换为向量类型。
示例:
[tidb]> 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(vector)
将向量类型转换为字符串类型。
示例:
[tidb]> SELECT VEC_AS_TEXT('[1.000, 2.5]');
+-------------------------------+
| VEC_AS_TEXT('[1.000, 2.5]') |
+-------------------------------+
| [1,2.5] |
+-------------------------------+
向量函数、有关向量的内置函数和向量数据类型运算符只在 TiDB 中支持,MySQL 不支持。