向量索引
DataVec向量引擎目前支持了IVFFLAT、HNSW、HNSWPQ以及IVFPQ等算法,基于openGauss中的ASTORE存储实现,通过索引结构能够高效地检索出查询结果。
向量索引创建语法支持普通索引创建语法中的内容
HNSW
CREATE INDEX [INDEX_NAME]
ON [TABLE_NAME]
USING hnsw (COLUMN_NAME [TYPE]_[DISTANCE_FUN]_ops)
with (m=<M>, ef_construction=<EF_CONSTRUCTION>)
[TABLESPACE tablespace_name]
[COMMENT text]
[VISIBLE | INVISIBLE]
[WHERE predicate];
INDEX_NAME
- 索引名TABLE_NAME
- 表名COLUMN_NAME
- 向量数据列名- TABLESPACE - 指定索引的表空间,与CREATEINDEX 相同
- COMMENT text - 指定索引的注释,与CREATEINDEX 相同
- VISIBLE|INVISIBLE - 指定索引是否可见,与CREATEINDEX 相同
- WHERE predicate - 创建一个部分索引,与CREATEINDEX 相同
HNSW索引操作符
HNSW索引操作符[TYPE]_[DISTANCE_FUN]_ops
格式:
TYPE
- 向量类型- vector
- bit
- sparsevec
HNSW索引支持向量数据维度:
名称 | 维度限制 |
---|---|
vector | 2,000 |
bit | 64,000 |
sparsevec | 1,000,000,000 1,000 非零元素数 |
DISTANCE_FUN
- 距离函数- l2
- ip
- cosine
- l1
- hamming
- jaccard
vector 索引操作符
索引操作符 | 描述 |
---|---|
vector_l2_ops | L2距离 |
vector_ip_ops | 内积 |
vector_cosine_ops | 余弦距离 |
vector_l1_ops | L1距离 |
bit 索引操作符
索引操作符 | 描述 |
---|---|
bit_hamming_ops | 汉明距离 |
bit_jaccard_ops | 杰卡德距离 |
sparsevec 索引操作符
索引操作符 | 描述 |
---|---|
sparsevec_l2_ops | L2距离 |
sparsevec_ip_ops | 内积 |
sparsevec_cosine_ops | 余弦距离 |
sparsevec_l1_ops | L1距离 |
索引选项
m
- 每个图层最大连接数(默认为16),设置范围2~100,该参数值取决于数据集和应用场景。ef_construction
- 用于图形构造的动态候选集大小(默认为64),设置范围4~1000,并且必须大于等于2*m。同时,为了保证搜索质量,ef_construction最好大于ef_search。
示例3: 使用L2距离计算创建HNSW索引并设置m = 16, ef_construction = 64
。
openGauss=# CREATE INDEX ON items USING hnsw (embedding vector_l2_ops) WITH (m = 16, ef_construction = 64);
提高 ef_construction
和m
可以提供更好的召回率,但会增加索引构建和插入时长。
查询选项
ef_search
- 查询时的动态候选集大小(默认为40),详情请参考DataVec向量引擎参数。
示例4: 设置当前会话中ef_search=100
。
openGauss=# SET hnsw_ef_search = 100;
并发选项
parallel_workers
- 构建索引并行度(默认为0),设置范围1~32
示例5: 构建索引并行数设置为32。
openGauss=# ALTER TABLE items SET(parallel_workers=32);
说明: hnsw构建图索引时会概率性出现某些数据点不可达的情况,这就导致索引查询返回数据量有误差。该情况和数据集、参数m、ef_construction有关,当增大m时会有改善。建议全量数据查找使用ivfflat索引,hnsw适用于limit远小于整体数据量的场景。
IVFFlat
CREATE INDEX [INDEX_NAME]
ON [TABLE_NAME]
USING ivfflat (COLUMN_NAME [TYPE]_[DISTANCE_FUN]_ops)
WITH (lists = <LISTS>)
[TABLESPACE tablespace_name]
[COMMENT text]
[VISIBLE | INVISIBLE]
[WHERE predicate];
INDEX_NAME
- 索引名TABLE_NAME
- 表名COLUMN_NAME
- 向量数据列名- TABLESPACE - 指定索引的表空间,与CREATEINDEX 相同
- COMMENT text - 指定索引的注释,与CREATEINDEX 相同
- VISIBLE|INVISIBLE - 指定索引是否可见,与CREATEINDEX 相同
- WHERE predicate - 创建一个部分索引,与CREATEINDEX 相同
IVFFlat索引操作符
IVFFlat索引操作符[TYPE]_[DISTANCE_FUN]_ops
格式:
TYPE
- 向量类型- vector
- bit
IVFFlat索引支持向量数据维度:
名称 | 维度限制 |
---|---|
vector | 2,000 |
bit | 64,000 |
DISTANCE_FUN
- 距离函数- l2
- ip
- cosine
- hamming
vector 索引操作符
索引操作符 | 描述 |
---|---|
vector_l2_ops | L2距离 |
vector_ip_ops | 内积 |
vector_cosine_ops | 余弦距离 |
bit 索引操作符
索引操作符 | 描述 |
---|---|
bit_hamming_ops | 汉明距离 |
sparsevec不支持IVFFLAT索引
索引选项
lists
- 倒排表(单元格)聚类中心数量(默认为100),设置范围1~32768
示例6: 使用L2距离计算创建IVFFlat索引并设置lists = 200。
openGauss=# CREATE INDEX ON items USING ivfflat (embedding vector_l2_ops) WITH (lists = 200);
说明:
优化召回率:
- 在表中有数据后创建索引。
- 选取适当的
lists
, 建议当数据集在100万行及以内:rows / 1000
;超过100万行的数据:sqrt(rows)
。- 查询时指定适当数量的probe,建议
sqrt(lists)
。
查询选项
probe
- 查询时候选集的大小(默认为1),详情请参考DataVec向量引擎参数。
openGauss=# SET ivfflat_probes = 10;
并发选项
parallel_workers
- 构建索引并行度(默认为0),设置范围1~32
示例7: 构建索引并行数设置为32。
openGauss=# ALTER TABLE items SET(parallel_workers=32);
非向量化索引:Btree/Ubtree
向量数据类型同时也支持btree和ubtree索引构建,会跟随数据表存储类型自动选择。
CREATE INDEX [INDEX_NAME]
ON [TABLE_NAME]
(COLUMN_NAME [TYPE]_ops) ;
btree/ubtree 索引操作符
- vector_ops
- bit_ops
- sparsevec_ops
示例8: 构建btree索引。
openGauss=# CREATE INDEX ON t (val vector_ops);
说明: Btree以及Ubtree索引不包含向量距离计算,只基于向量函数和操作符中的向量比较。
并行构建向量索引
通过开启并行构建功能来加速向量索引的创建:
ALTER TABLE [TABLE_NAME]
SET (parallel_workers = <CONCURRENCY_NUM>);
示例9: 构建索引并行数设置为8。
openGauss=# ALTER TABLE items SET (parallel_workers = 8);
修改向量索引
仅支持修改向量索引选项
ALTER INDEX [INDEX_NAME]
SET (parameter=<OPTIONS>);
示例10: 修改向量索引选项
openGauss=# ALTER INDEX t_val_idx SET (m=24, ef_construction=200);
openGauss=# REINDEX INDEX t_val_idx;
说明:
修改向量索引参数后需使用REINDEX
更新索引,并且REINDEX支持并行,并行度仍根据数据表中parallel_workers
决定。
不支持修改索引操作符,如vector_l2_ops到vector_cosine_ops。
alter index修改索引选项时,HNSWPQ、IVFPQ索引无法校验PQ相关参数,在reindex时进行校验。
约束
- 向量索引仅支持普通行存表,临时表,Toast表,Unlogged表,段页式表等,其他表仅支持对向量数据创建btree和ubtree索引。
- 若ALTER INDEX后不执行REINDEX,索引仍是原索引HNSW的选项配置,后插入的数据也会根据原索引选项构建索引。
- IVFFLAT、HNSW不支持ustore创建索引。
- 构建带有向量表时可以使用INDEX子句构建默认btree、ubtree索引,无法指定向量索引。
- 未指定向量列维度时无法构建向量索引,只支持构建btree、ubtree索引。
- 若在兼容B库中使用向量索引,需要执行
set dolphin.nulls_minimal_policy=false
,用于关闭nulls处理策略。 - 主备环境开启极致RTO情况下,不支持向量索引功能。