函数和操作符

VexDB 提供了多种函数和操作符来执行向量之间的操作。

操作符

  • <->
    计算两个向量之间的欧几里德距离。欧几里德距离是多维空间中向量表示的点之间的直线距离。较小的欧几里德距离表示向量之间的相似性较大,因此该运算符在查找和排序相似项目时非常有用。
    SELECT array[1,1,1,1]::floatvector <-> array[2,2,2,2]::floatvector AS value;
    
  • <#>
    计算两个向量的负内积。内积 = -1*负内积,内积表示两个向量在相同维度上的对应分量相乘后再求和的结果,内积越大表示方向越一致。
    SELECT -1 * (array[1,1,1,1]::floatvector <#> array[2,2,2,2]::floatvector) AS value;
    
  • <=>
    计算两个向量之间的余弦距离。余弦相似度 = 1-余弦距离,比较两个向量的方向而不是它们的大小。余弦相似度的范围在 -1 到 1 之间,1 表示向量相同,0 表示无关,-1 表示向量指向相反方向。
    SELECT 1 - (array[1,1,1,1]::floatvector <=>array[2,2,2,2]::floatvector) AS value;
    
  • +
    两个向量逐元素相加。
    SELECT array[1,1,1,1]::floatvector + array[2,2,2,2]::floatvector AS value;
    
  • -
    两个向量逐元素相减。
    SELECT array[1,1,1,1]::floatvector - array[2,2,2,2]::floatvector AS value;
    

内置函数

  • floatvector_combine(double precision, double precision)
    这个函数用于将两个 double precision 类型的数组逐元素相加成一个新的向量,返回这个新向量。
    SELECT floatvector_combine(ARRAY[1.0, 2.0, 3.0], array[4, 5,6]);
    
  • floatvector_accum(double precision, floatvector)
    这个函数用于将一个向量累加到数组中,返回一个新的数组。其中,被累加的数组及结果数组的第一个元素为累加次数,之后的元素为各维度的累积值。
    SELECT floatvector_accum(ARRAY[1.0, 2.0, 3.0], '[4, 5]'::floatvector);
    
  • floatvector_cmp(floatvector, floatvector)
    这个函数逐个比较两个向量的元素,找到第一个不同的元素并根据它判断大小关系。如果第一个向量小于第二个,返回 -1;如果相等,返回 0;如果第一个向量大于第二个,返回 1。
    SELECT floatvector_cmp('[1,1,1,1]'::floatvector ,'[2,2,2,2]'::floatvector) AS value;
    
  • floatvector_gt(floatvector, floatvector)
    这个函数逐个比较两个向量的元素,找到第一个不同的元素并根据它决定大小关系。如果第一个向量大于第二个向量,则返回 true,否则返回 false。
    SELECT floatvector_gt ('[1,1,1,1]'::floatvector ,'[2,2,2,2]'::floatvector) AS value;
    
  • floatvector_ge(floatvector, floatvector)
    这个函数逐个比较两个向量的元素,找到第一个不同的元素并根据它决定大小关系。如果第一个向量大于等于第二个向量,则返回 true,否则返回 false。
    SELECT floatvector_ge ('[1,1,1,1]'::floatvector ,'[2,2,2,2]'::floatvector) AS value;
    
  • floatvector_ne(floatvector, floatvector)
    这个函数用于比较两个向量,如果两个向量的任意元素不相等,则返回 true,否则返回 false。
    SELECT floatvector_ne ('[1,1,1,1]'::floatvector ,'[2,2,2,2]'::floatvector) AS value;
    
  • floatvector_eq(floatvector, floatvector)
    这个函数用于比较两个向量,如果两个向量的所有元素都相等,则返回 true,否则返回 false。
    SELECT floatvector_eq ('[1,1,1,1]'::floatvector ,'[2,2,2,2]'::floatvector) AS value;
    
  • floatvector_le(floatvector, floatvector)
    这个函数逐个比较两个向量的元素,找到第一个不同的元素并根据它决定大小关系。如果第一个向量小于等于第二个向量,则返回 true,否则返回 false。
    SELECT floatvector_le('[1,1,1,1]'::floatvector ,'[2,2,2,2]'::floatvector) AS value;
    
  • floatvector_lt(floatvector, floatvector)
    这个函数逐个比较两个向量的元素,找到第一个不同的元素并根据它决定大小关系。如果第一个向量小于于第二个向量,则返回 true,否则返回 false。
    SELECT floatvector_lt ('[1,1,1,1]'::floatvector ,'[2,2,2,2]'::floatvector) AS value;
    
  • floatvector_spherical_distance(floatvector, floatvector)
    这个函数用于计算两个向量之间的球面距离(spherical distance),即余弦相似度转换为归一化的角度比例。
    SELECT floatvector_spherical_distance('[1,1,1,1]'::floatvector ,'[2,2,2,2]'::floatvector) AS value;
    
  • floatvector_negative_inner_product(floatvector, floatvector)
    这个函数用于计算两个向量的负内积(negative inner product),即两个向量对应位置上的元素相乘后求和并取负值。
    SELECT floatvector_negative_inner_product ('[1,1,1,1]'::floatvector ,'[2,2,2,2]'::floatvector) AS value;
    
  • floatvector_l2_squared_distance(floatvector, floatvector)
    这个函数用于计算两个向量之间的 L2 范数的平方距离。L2 范数距离是向量元素差的平方和。
    SELECT floatvector_l2_squared_distance('[1,1,1,1]'::floatvector ,'[2,2,2,2]'::floatvector) AS value;
    
  • floatvector_avg(double precision)
    这个函数用于计算一个 double precision 类型数组中所有元素的值进行 N 等分。N 是数组的第一个元素,并返回一个 N 等分后的向量。
    SELECT floatvector_avg('{3, 4.56, 7.89}') AS value;
    
  • floatvector_sub(floatvector, floatvector)
    这个函数用于计算两个向量的元素级相减,返回一个新的向量,其中每个元素是对应位置上两个向量元素的差。
    SELECT floatvector_sub('[1,1,1,1]'::floatvector ,'[2,2,2,2]'::floatvector) AS value;
    
  • floatvector_add(floatvector, floatvector)
    这个函数用于计算两个向量的元素级相加,返回一个新的向量,其中每个元素是对应位置上两个向量元素的和。
    SELECT floatvector_add('[1,1,1,1]'::floatvector ,'[2,2,2,2]'::floatvector) AS value;
    
  • floatvector_norm(floatvector)
    这个函数用于计算给定向量的范数,即向量元素的平方和的平方根。
    SELECT floatvector_norm('[1,1,1,1]'::floatvector) AS value;
    
  • floatvector_dims(floatvector)
    这个函数用于返回给定向量的维度(即向量中元素的数量)。
    SELECT floatvector_dims ('[1,1,1,1]'::floatvector) AS value;
    
  • l2_distance(floatvector, floatvector)
    这个函数用于计算两个向量之间的 L2 范数距离。L2 范数距离也称为欧氏距离,表示两个向量之间的直线距离。
    SELECT l2_distance('[1,1,1,1]'::floatvector ,'[2,2,2,2]'::floatvector) AS value;
    
  • inner_product(floatvector, floatvector)
    这个函数用于计算两个向量的内积。内积是两个向量对应元素乘积的和。
    SELECT inner_product('[1,1,1,1]'::floatvector ,'[2,2,2,2]'::floatvector) AS value;
    
  • cosine_distance(floatvector, floatvector)
    这个函数用于计算两个向量之间的余弦距离。余弦距离是通过计算两个向量之间的夹角余弦值来衡量它们之间的相似度。
    SELECT cosine_distance('[1,1,1,1]'::floatvector ,'[2,2,2,2]'::floatvector) AS value;
    
  • floatvector_to_float4(floatvector)
    这个函数用于将向量类型数据转为浮点数数组函数。
    SELECT floatvector_to_float4 ('[2,2,2,2]'::floatvector) AS value;
    

使用示例

  • 获取与向量 3,1,2 距离最近的前 5 条记录(欧氏距离)。
    SELECT * FROM items ORDER BY embedding <-> '[3, 1, 2]' LIMIT 5;
    
  • 获取与 id=1 的向量最接近的 5 条记录(欧氏距离)。
    SELECT * FROM items WHERE id != 1 ORDER BY embedding <-> (SELECT embedding FROM items WHERE id = 1) LIMIT 5;
    
  • 结果过滤:与向量 3,1,2 距离 < 5 的所有记录(欧氏距离)。
    SELECT * FROM items WHERE embedding <-> '[3, 1, 2]' < 5;
    
  • 计算距离但不排序。
    SELECT embedding <-> '[3, 1, 2]' AS distance FROM items;
    
  • 计算向量与查询向量的内积:<#> 是负内积操作符,乘 -1 得到正内积。
    SELECT (embedding <#> '[3, 1, 2]') * -1 AS inner_product FROM items;
    
  • 计算向量与查询向量的余弦相似度。余弦相似度 = 1 - 余弦距离。
    SELECT 1 - (embedding <=> '[3, 1, 2]') AS cosine_similarity FROM items;
    

需要帮助?

扫码添加企业微信
获得专业技术支持

企业微信二维码
🎯 快速响应💡 专业解答