向量索引

DataVec向量引擎目前支持了IVFFLATHNSW、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索引支持向量数据维度:

名称维度限制
vector2,000
bit64,000
sparsevec1,000,000,000
1,000 非零元素数
  • DISTANCE_FUN - 距离函数
    • l2
    • ip
    • cosine
    • l1
    • hamming
    • jaccard

vector 索引操作符

索引操作符描述
vector_l2_opsL2距离
vector_ip_ops内积
vector_cosine_ops余弦距离
vector_l1_opsL1距离

bit 索引操作符

索引操作符描述
bit_hamming_ops汉明距离
bit_jaccard_ops杰卡德距离

sparsevec 索引操作符

索引操作符描述
sparsevec_l2_opsL2距离
sparsevec_ip_ops内积
sparsevec_cosine_ops余弦距离
sparsevec_l1_opsL1距离

索引选项

  • 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_constructionm可以提供更好的召回率,但会增加索引构建和插入时长。

查询选项

示例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索引支持向量数据维度:

名称维度限制
vector2,000
bit64,000
  • DISTANCE_FUN - 距离函数
    • l2
    • ip
    • cosine
    • hamming

vector 索引操作符

索引操作符描述
vector_l2_opsL2距离
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)

查询选项

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情况下,不支持向量索引功能。
意见反馈
编组 3备份
    openGauss 2025-05-22 22:42:50
    取消