向量函数和操作符
floatvector支持向量类型和数组类型之间的数据转换,同时支持特定格式的字符串转换成向量类型。
array<->floatvector:数据类型转换中向量数据类型可以和相对应的数组类型进行自由转换;floatvector向量的成员数据类型为浮点型。
string ->floatvector:注意字符串格式,使用中括号([])或者花括号({})包含数组,元素间使用逗号(,)隔开。
floatvector
功能说明:
场景1:数组数据转换为向量数据。
入参类型:anyarray
出参类型:floatvector
代码示例:
gaussdb=# SELECT floatvector(ARRAY[1,2,9.3]);
场景2:floatvector转换,对维度进行检测。
入参1的类型:floatvector
入参2的类型:integer
出参类型:floatvector
代码示例:
gaussdb=# SELECT floatvector(floatvector('[1,2,9.3]'),3);
vector_to_array
功能说明:向量数据转换为数组数据。
入参类型:floatvector
出参类型:real[]
代码示例:
gaussdb=# SELECT vector_to_array(floatvector('[1,2,3]'));
text_to_vector
功能说明:字符型数据转换为向量数据。
入参类型:cstring
出参类型:floatvector
代码示例:
gaussdb=# SELECT text_to_vector('[1,2,9.3]');
vector_in
功能说明:floatvector输入转换函数(文本格式)。
入参1的类型:cstring
入参2的类型:oid
入参3的类型:int4
出参类型:floatvector
代码示例:
gaussdb=# SELECT vector_in('[1,2,3]',701,3);
vector_out
功能说明:floatvector输出转换函数(文本格式)。
入参类型:floatvector
出参类型:cstring
代码示例:
gaussdb=# SELECT vector_out(floatvector('[1,2,3]'));
vector_send
功能说明:floatvector输入转换函数(二进制格式)。
入参类型:floatvector
出参类型:bytea
代码示例:
gaussdb=# SELECT vector_send(floatvector('[1,2,3]'));
vector_recv
功能说明:floatvector输出转换函数(二进制格式)。
入参1的类型:integer
入参2的类型:oid
入参3的类型:int4
出参类型:floatvector
代码示例:
--系统函数,无法sql调用。
vector_typmod_in
功能说明:floatvector输入类型修改符函数。
入参类型:cstring[]
出参类型:integer
代码示例:
gaussdb=# SELECT vector_typmod_in( '{1}' );
- 向量数据类型成员仅支持单精度。
- 向量间计算仅支持相同维度,如果维度不同将报错。
- floatvector支持向量加减操作,点乘操作由函数(inner_product)完成。
- 建表时向量类型必须要指定维度;当插入数据的维度与设置的数据维度不一致时,系统会报错。
- 需要注意如果数据表中已经插入数据,变换向量维度时需要表中数据符合维度设定,否则数据库报错;当向量属性已创建向量索引,属性的数据类型无法切换到其他数据类型,数据库会报错。
boolvector
场景1:
功能说明:数组数据转换为向量数据。
入参类型:anyarray
出参类型:boolvector
代码示例:
gaussdb=# SELECT boolvector(ARRAY[1,0,1]);
场景2:
功能说明:boolvector转换,对维度进行检测。
入参1的类型:boolvector
入参2的类型:integer
出参类型:boolvector
代码示例:
gaussdb=# SELECT boolvector(boolvector('[1,0,1]'),3);
boolvector_to_array
功能说明:向量数据转换为数组数据。
入参类型:boolvector
出参类型:anyarray
代码示例:
gaussdb=# SELECT boolvector_to_array(boolvector('[1,0,1]'));
text_to_boolvector
功能说明:字符型数据转换为向量数据。
入参类型:cstring
出参类型:boolvector
代码示例:
gaussdb=# SELECT text_to_boolvector('[1,1,1]');
bool_vector_in
功能说明:boolvector输入转换函数(文本格式)。
入参1的类型:cstring
入参2的类型:oid
入参3的类型:int4
出参类型:boolvector
代码示例:
gaussdb=# SELECT bool_vector_in('[1,1,1]',701,3);
bool_vector_out
功能说明:boolvector输出转换函数(文本格式)。
入参类型:boolvector
出参类型:cstring
代码示例:
gaussdb=# SELECT bool_vector_out(boolvector('[1,1,1]'));
bool_vector_send
功能说明:boolvector输入转换函数(二进制格式)。
入参类型:boolvector
出参类型:bytea
代码示例:
gaussdb=# SELECT bool_vector_send(boolvector('[1,1,1]'));
bool_vector_recv
功能说明:boolvector输出转换函数(二进制格式)。
入参1的类型:internal
入参2的类型:oid
入参3的类型:int4
出参类型:boolvector
代码示例:
--系统函数,无法sql调用。
bool_vector_typmod_in
功能说明:boolvector输入类型修改符函数。
入参类型:cstring[]
出参类型:integer
代码示例:
gaussdb=# SELECT bool_vector_typmod_in( '{1}' );
- 向量数据类型不支持Null、Nan、Inf作为元素,当向量中含有NULL值,数据库会报错。
- 插入向量数据类型时,不支持NULL作为插入值,当插入NULL值作为向量数据时,数据库会报错。
- boolvector类型的元素可使用t(T)\f(F)、y(Y)\n(N)、1\0、true\false、yes\no、on\off等方式表达布尔型数据。
- boolvector仅支持等于操作,不支持大小比较。
gs_vector_index_options
功能说明:显示相关向量索引的超参取值。
入参类型:text
出参类型:text
代码示例:
--创建表。 gaussdb=# CREATE TABLE t1 (id int unique,repr floatvector(960)); --插入数据: gaussdb=# CREATE OR REPLACE FUNCTION float_random_array(dims int,range int) RETURNS float[] AS $$BEGIN RETURN ARRAY(SELECT (random() * range)::int FROM generate_series(1, dims));END;$$ LANGUAGE plpgsql; gaussdb=# INSERT INTO t1 SELECT i,floatvector(float_random_array(960,100)) FROM generate_series(1,1000) as i; --创建索引: gaussdb=# CREATE INDEX test1v on t1 using gsdiskann (repr l2) with (pq_nseg=120,pq_nclus=64,queue_size=120,num_parallels=30,enable_pq=true,using_clustering_for_parallel=false); gaussdb=# SELECT gs_vector_index_options('test1v');
gs_diskann_inspect
功能说明:查询索引健康状态,包括索引磁盘使用、PQ压缩准确度、索引图连接健康度、Vacuum状态等信息。
场景1:
入参类型:text
出参类型:record
代码示例:
-- 创建表 gaussdb=# CREATE TABLE t1 (id int unique,repr floatvector(960)); -- 插入数据 gaussdb=# CREATE OR REPLACE FUNCTION float_random_array(dims int,range int) RETURNS float[] AS $$BEGIN RETURN ARRAY(SELECT (random() * range)::int FROM generate_series(1, dims));END;$$ LANGUAGE plpgsql; gaussdb=# INSERT INTO t1 SELECT i,floatvector(float_random_array(960,100)) FROM generate_series(1,1000) as i; -- 创建向量索引 gaussdb=# CREATE INDEX test1v on t1 using gsdiskann (repr l2) with (pq_nseg=120,pq_nclus=64,queue_size=120,num_parallels=30,enable_pq=true,using_clustering_for_parallel=false); -- 显示索引状态 gaussdb=# SELECT * FROM gs_diskann_inspect('test1v');
场景2:
入参1的类型:text
入参2的类型:text
出参类型:record
代码示例:
-- 创建分区表 gaussdb=# CREATE TABLE t1 (id int unique,repr floatvector(960)) partition by hash(id) (partition p1, partition p2, partition p3); -- 插入数据 gaussdb=# CREATE OR REPLACE FUNCTION float_random_array(dims int,range int) RETURNS float[] AS $$BEGIN RETURN ARRAY(SELECT (random() * range)::int FROM generate_series(1, dims));END;$$ LANGUAGE plpgsql; gaussdb=# INSERT INTO t1 SELECT i,floatvector(float_random_array(960,100)) FROM generate_series(1,1000) as i; -- 创建分区向量索引 gaussdb=# CREATE INDEX test1v on t1 using gsdiskann (repr l2) local with (pq_nseg=120,pq_nclus=64,queue_size=120,num_parallels=30,enable_pq=true,using_clustering_for_parallel=false); -- 查询分区名和分区索引名 SELECT oid,relname,parttype,parentid,boundaries FROM pg_partition WHERE parentid = 't1'::regclass::oid; SELECT oid,relname,parttype,parentid,boundaries,indextblid FROM pg_partition WHERE parentid = 'test1v'::regclass::oid; -- 显示分区索引状态 gaussdb=# SELECT * FROM gs_diskann_inspect('test1v', 'p1_repr_idx');
针对向量计算的操作符,主要集中在衡量向量间相似度,以及向量的二元计算符:
<->
功能说明:计算两向量(floatvector)之间欧氏距离(L2)。
左参数类型:floatvector
右参数类型:floatvector
返回值类型:double precision
代码示例:
gaussdb=# SELECT floatvector('[1,1,3,2]') <-> floatvector('[1,1,3,2]'); gaussdb=# SELECT '[1,2,3,2]'<-> floatvector('[1,1,3,2]');
<+>
功能说明:计算两向量(floatvector)之间余弦距离(COSINE)。
左参数类型:floatvector
右参数类型:floatvector
返回值类型:double precision
代码示例:
gaussdb=# SELECT floatvector('[1,1,3,2]') <+> floatvector('[1,1,3,2]'); gaussdb=# SELECT '[1,2,3,2]'<+> floatvector('[1,1,3,2]');
<#>
功能说明:计算两向量(boolvector)之间汉明距离(HAMMING)。
左参数类型:boolvector
右参数类型:boolvector
返回值类型:double precision
代码示例:
gaussdb=# SELECT boolvector('[1,0,1,0]') <#> boolvector('[1,1,1,0]'); gaussdb=# SELECT '[1,0,1,0]'<#> boolvector('[1,1,1,0]');
+
功能说明:计算两个维度相同的向量按位相加。
左参数类型:floatvector
右参数类型:floatvector
返回值类型:floatvector
代码示例:
gaussdb=# SELECT floatvector('[1,1,3,2]') + floatvector('[1,1,3,2]'); gaussdb=# SELECT '[1,2,3,2]'+ floatvector('[1,1,3,2]');
-
功能说明:计算两个维度相同的向量按位相减。
左参数类型:floatvector
右参数类型:floatvector
返回值类型:floatvector
代码示例:
gaussdb=# SELECT floatvector('[1,1,3,2]') + floatvector('[1,1,3,2]'); gaussdb=# SELECT '[1,2,3,2]'+ floatvector('[1,1,3,2]');
<
功能说明:比较两个维度相同的向量字典序的大小关系。
左参数类型:floatvector
右参数类型:floatvector
返回值类型:BOOLEAN
代码示例:
gaussdb=# SELECT floatvector('[1,1,3,2]') < floatvector('[1,1,3,2]'); gaussdb=# SELECT '[1,2,3,2]'< floatvector('[1,1,3,2]');
<=
功能说明:比较两个维度相同的向量字典序的大小关系。
左参数类型:floatvector
右参数类型:floatvector
返回值类型:BOOLEAN
代码示例:
gaussdb=# SELECT floatvector('[1,1,3,2]') <= floatvector('[1,1,3,2]'); gaussdb=# SELECT '[1,2,3,2]'<= floatvector('[1,1,3,2]');
>
功能说明:比较两个维度相同的向量字典序的大小关系。
左参数类型:floatvector
右参数类型:floatvector
返回值类型:BOOLEAN
代码示例:
gaussdb=# SELECT floatvector('[1,1,3,2]') > floatvector('[1,1,3,2]'); gaussdb=# SELECT '[1,2,3,2]'> floatvector('[1,1,3,2]');
>=
功能说明:比较两个维度相同的向量字典序的大小关系。
左参数类型:floatvector
右参数类型:floatvector
返回值类型:BOOLEAN
代码示例:
gaussdb=# SELECT floatvector('[1,1,3,2]') >= floatvector('[1,1,3,2]'); gaussdb=# SELECT '[1,2,3,2]'>= floatvector('[1,1,3,2]');
=
场景1:
功能说明:判断两个维度相同的向量是否相等。
左参数类型:floatvector
右参数类型:floatvector
返回值类型:BOOLEAN
代码示例:
gaussdb=# SELECT floatvector('[1,1,3,2]') = floatvector('[1,1,3,2]'); gaussdb=# SELECT '[1,2,3,2]'= floatvector('[1,1,3,2]');
场景2:
功能说明:判断两个维度相同的布尔向量是否一致。
左参数类型:boolvector
右参数类型:boolvector
返回值类型:BOOLEAN
代码示例:
gaussdb=# SELECT boolvector('[1,0,1,0]') = boolvector('[1,1,1,0]'); gaussdb=# SELECT '[1,0,1,0]' = boolvector('[1,1,1,0]');
<>
功能说明:判断两个维度相同的向量是否不相等。
左参数类型:floatvector
右参数类型:floatvector
返回值类型:BOOLEAN
代码示例:
gaussdb=# SELECT floatvector('[1,1,3,2]') <> floatvector('[1,1,3,2]'); gaussdb=# SELECT '[1,2,3,2]'<> floatvector('[1,1,3,2]');
若向量元素值过大,在计算距离时,会出现中间计算结果溢出单精度范围的情况,导致距离结果为NAN或INF。