向量函数和操作符

Vector

Vector 操作符

操作符描述
+元素级加法
-元素级减法
*元素级乘法
=等于
<>不等于
||向量拼接
<->欧几里得距离 (L2)
<#>负内积
<=>余弦距离
<+>曼哈顿距离 (L1)
  • +

    描述:元素级加法。

    示例:

    openGauss=> select '[1,2,3]'::vector + '[4,5,6]';
     ?column? 
    ----------
     [5,7,9]
    (1 row)
    
  • -

    描述:元素级减法。

    示例:

    openGauss=> select '[1,2,3]'::vector - '[4,5,6]';
      ?column?  
    ------------
     [-3,-3,-3]
    (1 row)
    
  • *

    描述:元素级乘法。

    示例:

    openGauss=> select '[1,2,3]'::vector * '[4,5,6]';
     ?column?  
    -----------
     [4,10,18]
    (1 row)
    
  • =

    描述:等于。

    示例:

    openGauss=# select '[1,2,3]'::vector = '[4,5,6]';
     ?column? 
    ----------
     f
    (1 row)
    
  • <>

    描述:不等于。

    示例:

    openGauss=# select '[1,2,3]'::vector <> '[4,5,6]';
     ?column? 
    ----------
     t
    (1 row)
    
  • ||

    描述:向量拼接。

    示例:

    openGauss=> select '[1,2,3]'::vector || '[4,5,6]';
       ?column?    
    ---------------
     [1,2,3,4,5,6]
    (1 row)
    
  • <->

    描述:欧几里得距离 (L2)。

    示例:

    openGauss=# SELECT '[0,0]'::vector <-> '[3,4]';
     ?column? 
    ----------
            5
    (1 row)
    
  • <#>

    描述:负内积。

    示例:

    openGauss=# SELECT '[1,2]'::vector <#> '[3,4]';
     ?column? 
    ----------
          -11
    (1 row)
    
  • <=>

    描述:余弦距离。

    示例:

    openGauss=# SELECT '[1,2]'::vector <=> '[2,4]';
     ?column? 
    ----------
            0
    (1 row)
    
  • <+>

    描述:曼哈顿距离。

    示例:

    openGauss=# SELECT '[0,0]'::vector <+> '[3,4]';
     ?column? 
    ----------
            7
    (1 row)
    

Vector 函数

函数描述
binary_quantize(vector) → bit二进制量化
cosine_distance(vector, vector) → double precision余弦距离
inner_product(vector, vector) → double precision内积
l1_distance(vector, vector) → double precision曼哈顿距离 (L1)
l2_distance(vector, vector) → double precision欧几里得距离 (L2)
l2_normalize(vector) → vector归一化(使用L2距离)
subvector(vector, integer, integer) → vector截取子向量
vector_dims(vector) → integer向量的维度数
vector_norm(vector) → double precision欧几里得范数
  • binary_quantize

    描述:二进制量化,若元素大于0,则量化为1;若元素小于或等于0,则量化为0。

    返回类型:bit

    示例:

    openGauss=# SELECT binary_quantize('[1,0,-1]'::vector);
     binary_quantize 
    -----------------
     100
    (1 row)
    
  • cosine_distance

    描述:余弦距离。

    返回类型:float8

    示例:

    openGauss=# SELECT cosine_distance('[1,2]'::vector, '[2,4]');
     cosine_distance 
    -----------------
                   0
    (1 row)
    
  • inner_product

    描述:内积。

    返回类型:float8

    示例:

    openGauss=# SELECT inner_product('[1,2]'::vector, '[3,4]');
     inner_product 
    ---------------
                11
    (1 row)
    
  • l1_distance

    描述:曼哈顿距离 (L1)。

    返回类型:float8

    示例:

    openGauss=# SELECT l1_distance('[0,0]'::vector, '[3,4]');
     l1_distance 
    -------------
               7
    (1 row)
    
  • l2_distance

    描述:欧几里得距离 (L2)。

    返回类型:float8

    示例:

    openGauss=# SELECT l2_distance('[0,0]'::vector, '[3,4]');
     l2_distance 
    -------------
               5
    (1 row)
    
  • l2_normalize

    描述:归一化(使用L2距离)。

    返回类型:vector

    示例:

    openGauss=# SELECT l2_normalize('[3,4]'::vector);
     l2_normalize 
    --------------
     [0.6,0.8]
    (1 row)
    
  • subvector

    描述:截取子向量。

    返回类型:vector

    示例:

    openGauss=# SELECT subvector('[1,2,3,4,5]'::vector, 1, 3);
     subvector 
    -----------
     [1,2,3]
    (1 row)
    
  • vector_dims

    描述:向量的维度数。

    返回类型:int

    示例:

    openGauss=# SELECT vector_dims('[1,2,3]'::vector);
     vector_dims 
    -------------
               3
    (1 row)
    
  • vector_norm

    描述:欧几里得范数。

    返回类型:float8

    示例:

    openGauss=# SELECT vector_norm('[3,4]');
     vector_norm 
    -------------
               5
    (1 row)
    

Vector 聚合函数

函数描述
avg(vector) → vector平均值
sum(vector) → vector求和
  • avg

    描述:平均值。

    返回类型:vector

    示例:

    openGauss=# SELECT avg(v) FROM unnest(ARRAY['[1,2,3]'::vector, '[3,5,7]']) v;
        avg    
    -----------
     [2,3.5,5]
    (1 row)
    
  • sum

    描述:求和。

    返回类型:vector

    示例:

    openGauss=# SELECT sum(v) FROM unnest(ARRAY['[1,2,3]'::vector, '[3,5,7]', NULL]) v;
       sum    
    ----------
     [4,7,10]
    (1 row)
    

Vector 类型转换

  • 格式:
SELECT ITEM::vetcor

SELECT vector(ITEM);

SELECT cast(ITEM AS vector);

说明: vector()仅支持text或者同为vector类型转换

TEXT/VARCHAR 转 vector
  • 示例:
openGauss=# SELECT '[1,2,3]'::vector;
 vector  
---------
 [1,2,3]
(1 row)

openGauss=# select vector('[4,5,6]');
 vector  
---------
 [4,5,6]
(1 row)

openGauss=# SELECT cast(ARRAY[1,2,3] AS vector);
  array  
---------
 [1,2,3]
(1 row)
Int Array 转 vector
  • 示例:
openGauss=# SELECT ARRAY[1,2,3]::vector;
  array  
---------
 [1,2,3]
(1 row)
Real Array 转 vector
  • 示例:
openGauss=# SELECT ARRAY[1,2,3]::float4[]::vector(3);
  array  
---------
 [1,2,3]
(1 row)
Double Array 转 vector
  • 示例:
openGauss=# SELECT ARRAY[1,2,3]::float8[]::vector;
  array  
---------
 [1,2,3]
(1 row)
Numeric Array 转 vector
  • 示例:
openGauss=# SELECT ARRAY[1,2,3]::numeric[]::vector;
  array  
---------
 [1,2,3]
(1 row)

说明: 只有当注明转换向量类型维度时,如ARRAY[1,2,3]::vector(3),会在转换时对前置类型进行维度效验。

Vector 转 Int Array
  • 示例:
openGauss=# SELECT '[1,2,3]'::vector::int[];
  int4   
---------
 {1,2,3}
(1 row)
Vector 转 Real Array
  • 示例:
openGauss=# SELECT '[1,2,3]'::vector::real[];
 float4  
---------
 {1,2,3}
(1 row)
Vector 转 Double Array
  • 示例:
openGauss=# SELECT '[1,2,3]'::vector::float8[];
 float8  
---------
 {1,2,3}
(1 row)
Vector 转 Numeric Array
  • 示例:
openGauss=# SELECT '[1,2,3]'::vector::numeric(10,3)[];
       numeric       
---------------------
 {1.000,2.000,3.000}
(1 row)
Vector 转 Text Array
  • 示例:
openGauss=# SELECT '[1,2,3]'::vector::text[];
    text       
---------
 {1,2,3}
(1 row)
Vector 转 Varchar Array
  • 示例:
openGauss=# SELECT '[1.21,2.32,3]'::vector::varchar(3)[];
    varchar       
--------------
 {1.2,2.3,3}
(1 row)

说明: vector转换字符数组仅支持text和varchar,其余字符类型暂未支持。

Bit

Bit 操作符

操作符描述
<~>汉明距离
<%>杰卡德距离
  • <~>

    描述:汉明距离。

    返回类型:uint64

    示例:

    openGauss=# SELECT '111' <~> '110';
     ?column? 
    ----------
            1
    (1 row)
    
  • <%>

    描述:杰卡德距离。

    返回类型:double

    示例:

    openGauss=# SELECT '1111' <%>  '1000';
     ?column? 
    ----------
          .75
    (1 row)
    

Bit 函数

函数描述
hamming_distance(bit, bit) → double precision汉明距离
jaccard_distance(bit, bit) → double precision杰卡德距离
  • hamming_distance

    描述:汉明距离。

    返回类型:uint64

    示例:

    openGauss=# SELECT hamming_distance('111', '110');
     hamming_distance 
    ------------------
                    1
    (1 row)
    
  • jaccard_distance

    描述:杰卡德距离。

    返回类型:double

    示例:

    openGauss=# SELECT jaccard_distance('1111', '1110');
     jaccard_distance 
    ------------------
                  .25
    (1 row)
    

Sparsevec

Sparsevec 操作符

操作符描述
<->欧几里得距离 (L2)
<#>负内积
<=>余弦距离
<+>曼哈顿距离 (L1)
=等于
<>不等于
  • <->

    描述:欧几里得距离 (L2)。

    返回类型:float8

    示例:

    openGauss=# SELECT '{}/2'::sparsevec <-> '{1:3,2:4}/2';
     ?column? 
    ----------
            5
    (1 row)
    
  • <#>

    描述:负内积。

    返回类型:float8

    示例:

    openGauss=# SELECT '{1:1,2:2}/2'::sparsevec <#> '{1:3,2:4}/2';
     ?column? 
    ----------
          -11
    (1 row)
    
  • <=>

    描述:余弦距离。

    返回类型:float8

    示例:

    openGauss=# SELECT '{1:1,2:2}/2'::sparsevec <=> '{1:2,2:4}/2';
     ?column? 
    ----------
            0
    (1 row)
    
  • <+>

    描述:曼哈顿距离 (L1)。

    返回类型:float8

    示例:

    openGauss=# SELECT '{}/2'::sparsevec <+> '{1:3,2:4}/2';
     ?column? 
    ----------
            7
    (1 row)
    
  • =

    描述:等于。

    示例:

    openGauss=# SELECT '{1:1,2:2,3:3}/3'::sparsevec = '{1:1,2:2,3:3}/3';
     ?column? 
    ----------
     t
    (1 row)
    
  • <>

    描述:不等于。

    示例:

    openGauss=# SELECT '{1:1,2:2,3:3}/3'::sparsevec <> '{1:1,2:2,3:3}/3';
     ?column? 
    ----------
     f
    (1 row)
    

Sparsevec 函数

函数描述
cosine_distance(sparsevec, sparsevec) → double precision余弦距离
inner_product(sparsevec, sparsevec) → double precision内积
l1_distance(sparsevec, sparsevec) → double precision曼哈顿距离 (L1)
l2_distance(sparsevec, sparsevec) → double precision欧几里得距离 (L2)
l2_norm(sparsevec) → double precision欧几里得范数
l2_normalize(sparsevec) → sparsevec归一化(使用L2距离)
  • cosine_distance

    描述:余弦距离。

    返回类型:float8

    示例:

    openGauss=# SELECT cosine_distance('{1:1,2:2}/2'::sparsevec, '{1:2,2:4}/2');
     cosine_distance 
    -----------------
                   0
    (1 row)
    
  • inner_product

    描述:内积。

    返回类型:float8

    示例:

    openGauss=# SELECT inner_product('{1:1,2:2}/2'::sparsevec, '{1:2,2:4}/2');
     inner_product 
    ---------------
                10
    (1 row)
    
  • l1_distance

    描述:曼哈顿距离 (L1)。

    返回类型:float8

    示例:

    openGauss=# SELECT l1_distance('{}/2'::sparsevec, '{1:3,2:4}/2');
     l1_distance 
    -------------
               7
    (1 row)
    
  • l2_distance

    描述:欧几里得距离 (L2)。

    返回类型:float8

    示例:

    openGauss=# SELECT l2_distance('{}/2'::sparsevec, '{1:3,2:4}/2');
     l2_distance 
    -------------
               5
    (1 row)
    
  • l2_norm

    描述:欧几里得范数。

    返回类型:float8

    示例:

    openGauss=# SELECT l2_norm('{1:3,2:4}/2'::sparsevec);
     l2_norm 
    ---------
           5
    (1 row)
    
  • l2_normalize

    描述:归一化(使用L2距离)。

    返回类型:sparsevec

    示例:

    openGauss=# SELECT l2_normalize('{1:3,2:4}/2'::sparsevec);
      l2_normalize   
    -----------------
     {1:0.6,2:0.8}/2
    (1 row)
    

Sparsevec 类型转换

  • 格式
SELECT ITEM::sparsevec

SELECT sparsevec(ITEM);

SELECT cast(ITEM AS sparsevec);

说明: sparsevec()仅支持text或者同为sparsevec类型转换

TEXT/VARCHAR 转 sparsevec
  • 示例:
openGauss=# SELECT '{1:1.5,3:3.5}/5'::sparsevec;
    sparsevec    
-----------------
 {1:1.5,3:3.5}/5
(1 row)
Vector 转 sparsevec
  • 示例:
openGauss=# SELECT '[0,1.5,0,3.5,0]'::vector::sparsevec;
    sparsevec    
-----------------
 {2:1.5,4:3.5}/5
(1 row)
Sparsevec 转 Vector
  • 示例:
openGauss=# SELECT '{2:1.5,4:3.5}/5'::sparsevec::vector(5);
     vector      
-----------------
 [0,1.5,0,3.5,0]
(1 row)

说明:
向量数据类型会和其他类型使用同样的函数名、操作符,为确保执行向量操作无误,建议对至少一个入参进行显式类型转换,如 SELECT l2_distance('[0,0]'::vector, '[3,4]');

意见反馈
编组 3备份
    openGauss 2025-04-24 08:40:47
    取消