Skip to content

Latest commit

 

History

History
284 lines (205 loc) · 12.1 KB

vector-search-functions-and-operators.md

File metadata and controls

284 lines (205 loc) · 12.1 KB
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

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

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

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

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

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

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

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

VEC_AS_TEXT(vector)

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

示例:

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

MySQL 兼容性

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

另请参阅