
# 向量函数和操作符
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}' );
```
![](https://support.huaweicloud.com/centralized-vector-devg-v10-gaussdb/public_sys-resources/note_3.0-zh-cn.png)
- 向量数据类型成员仅支持单精度。
- 向量间计算仅支持相同维度，如果维度不同将报错。
- 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}' );
```
![](https://support.huaweicloud.com/centralized-vector-devg-v10-gaussdb/public_sys-resources/note_3.0-zh-cn.png)
- 向量数据类型不支持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]');
```
![](https://support.huaweicloud.com/centralized-vector-devg-v10-gaussdb/public_sys-resources/note_3.0-zh-cn.png)
若向量元素值过大，在计算距离时，会出现中间计算结果溢出单精度范围的情况，导致距离结果为NAN或INF。
