向量函数和操作符
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'); gs_ivfflat_inspect
功能说明:查询GsIvfflat索引状态,包括固定页面号、索引磁盘使用、聚簇中向量数据分布等信息。
场景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=# SET maintenance_work_mem='128MB';
gaussdb=# CREATE INDEX test1v on t1 using gsivfflat (repr l2) with (ivf_nlist=10);
-- 显示索引状态
gaussdb=# SELECT * FROM gs_ivfflat_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=# SET maintenance_work_mem='128MB';
gaussdb=# CREATE INDEX test1v on t1 using gsivfflat (repr l2) LOCAL with (ivf_nlist=10);
-- 查询分区名和分区索引名
gaussdb=# SELECT oid,relname,parttype,parentid,boundaries FROM pg_partition WHERE parentid = 't1'::regclass::oid;
gaussdb=# SELECT oid,relname,parttype,parentid,boundaries,indextblid FROM pg_partition WHERE parentid = 'test1v'::regclass::oid;
-- 显示分区索引状态
gaussdb=# SELECT * FROM gs_ivfflat_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 distance)。
左参数类型: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。