跳转至
开发版采用单机部署,无需产品 License 文件。需要多机部署或大规模性能测试? 了解企业版

CREATE VECTOR INDEX

CREATE VECTOR INDEX语句用于为特定图创建向量索引。

可选择以下任意方法来指定图:

  • 在本语句前添加 USE 子句来设定工作图。
  • 提前使用 SESSION SET 设置当前会话的图。

若两种方法均使用,则以 USE 子句中的指定为准。若均未使用,则报错。

您可以基于单个点类型或边类型的单个属性创建向量索引,从而加速基于索引属性进行的近似最近邻(Approximate Nearest Neighbor,简称 ANN)的搜索查询。

若要创建其他类型的索引,请参见 CREATE NORMAL INDEX、CREATE SPATIAL INDEX 和 CREATE FULLTEXT INDEX。

向量索引实现原理

在创建向量索引后,会生成以下数据:

  • 描述向量索引的元数据。
  • 存储在 RocksDB 中、将索引向量映射到其对应的点或边的键值对。
  • 驻留在内存中用于加速 ANN 搜索的 ANN 索引。

Note

若有多个 Storage 服务在运行,会在每个 Storage 服务上创建并维护多个 ANN 索引。

  • ANN 索引的可用性由 Raft 一致性算法保证。即便发生 Leader 更改,新 Leader 上的 ANN 索引也确保与前任上的索引一致。
  • 每个 Storage 服务中所有 ANN 索引的最大内存用量由配置项ann_index_memory_quota_in_kb控制。若超出此配额,与向量索引相关的插入操作将导致错误。

为了确保 ANN 索引的数据完整性,以预写日志记录(Write-ahead logging,简称 WAL)的方式,保证对索引的更改只有在记录到日志后才会写入,也即在 WAL 记录持久化到磁盘后才会写入。

每个 ANN 索引对应两个持久化到磁盘的文件:WAL 文件(.annwal)和完整索引文件(.annidx)。对 ANN 索引的更改只有在记录到 WAL 文件后才会写入。当超出由配置项ann_write_idx_file_threshold_of_log_num指定的阈值后,WAL 文件中的记录将被汇总并写入完整索引文件,WAL 文件中对应的重复记录将被删除。

WAL 文件占用的磁盘空间大于完整索引文件,但在 I/O 效率方面优于后者。建议将该阈值设置为能平衡存储使用量和 I/O 效率的值。

WAL 文件和完整索引文件存储在 Storage 服务的配置项data_path指定的路径下。当发生系统崩溃时,WAL 文件和完整索引文件都是恢复 ANN 索引所必需的。

Note

对非默认 Schema 或其中的对象执行操作时,用户既要通过隐式访问规则或显式USAGE授权获得该 Schema 的访问权,也要具备目标操作所需的权限。Schema 访问校验和目标操作所需的权限校验相互独立,满足其中一项不能替代另一项。Schema 访问控制不适用于临时图、内置 Procedure 和内置 Function。更多信息,请参见 Schema 访问控制。

前提条件

  • 图已创建。更多信息,请参见 CREATE GRAPH。
  • 若要创建向量索引,必须是图的所有者,或具备在图上执行INDEX操作的权限,或具备在当前 Schema 执行CREATE INDEX操作的权限。更多信息,请参见角色与权限。

限制条件

创建向量索引后,不支持备份向量索引。您仍可以备份图数据,但备份文件中将不会包含向量索引。

语法

create_vector_index_statement
CREATE VECTOR INDEX IF NOT EXISTS index_name ON NODE VERTEX TYPE node_type_name EDGE RELATIONSHIP TYPE edge_type_name :: property_name OPTIONS { ann_index_option , }
ann_index_option
DIM : int_value METRIC : L2 IP TYPE : IVF HNSW NLIST : int_value TRAINSIZE : int_value MAXDEGREE : int_value EFCONSTRUCTION : int_value CAPACITY : int_value

create_vector_index_statement ::=
    'CREATE' 'VECTOR' 'INDEX' ('IF NOT EXISTS')? index_name 'ON' ( ( ('NODE' | 'VERTEX') 'TYPE'? node_type_name ) | ( ('EDGE'|'RELATIONSHIP') 'TYPE'? edge_type_name ) ) '::' property_name 'OPTIONS' '{' ann_index_option (',' ann_index_option)* '}'    

ann_index_option ::= 
    'DIM' ':' int_value
  | 'METRIC' ':' ( 'L2' | 'IP' )
  | 'TYPE' ':' ( 'IVF' | 'HNSW' )
  | 'NLIST' ':' int_value
  | 'TRAINSIZE' ':' int_value
  | 'MAXDEGREE' ':' int_value
  | 'EFCONSTRUCTION' ':' int_value
  | 'CAPACITY' ':' int_value

参数

IF NOT EXISTS

该子句会检查是否已存在同名的索引。若已存在,则不会创建索引,也不会抛出异常。

若未指定该子句,且已存在同名的索引,则会抛出异常。

index_name

待创建的向量索引的名称。该名称为常规标识符,在同一个图的所有类型的索引中,索引名称必须唯一。

有关标识符的详细信息,请参见标识符命名规则。

node_type_name

待创建向量索引的点类型的名称。该点类型必须至少有一个值类型为VECTOR的属性。

edge_type_name

待创建向量索引的边类型的名称。该边类型必须至少有一个值类型为VECTOR的属性。

property_name

待创建向量索引的点类型或边类型的属性名称。属性的值类型必须为VECTOR。更多信息,请参见向量。

ann_index_option

用于创建向量索引的选项,其中选项DIM为必选,其余选项均为可选。

DIM

待创建的向量索引的维度数,必须与创建索引的属性的维度数相同,该属性的值类型必须为VECTOR。

METRIC

用于计算向量索引中向量之间相似度的度量。可选值包括:

  • L2:使用欧几里得距离度量,即基于向量之间的欧几里得距离计算相似度。
  • IP:使用内积度量,即基于向量之间的内积计算相似度。

此处指定的相似性度量决定了在执行 ANN 搜索时用于计算向量相似度的函数。更多信息,请参见最近邻查询。

若未指定该选项,则默认值L2生效。

TYPE

用于创建向量索引的算法。可选值包括:

若未指定该选项,则默认值IVF生效。

NLIST

构建 IVF 索引时创建的聚类数。每个聚类对应一个倒排列表,用于存储分配给该聚类的向量的引用。此选项仅在选项TYPE设置为IVF时生效。

该选项决定了 IVF 索引的粒度。取值越大,每个聚类中的平均向量数量越少,从而提高搜索速度,但会降低搜索的召回率。

若未指定该选项且TYPE设置为IVF,则默认值8生效。

TRAINSIZE

构建 IVF 索引时用于训练索引的向量数。此选项仅在选项TYPE设置为IVF时生效。

该选项决定了 IVF 索引的聚类质量。取值越大,扫描的向量越多,以找到每个向量的最佳聚类,从而提高搜索的召回率,但会增加训练时间。

若未指定该选项且TYPE设置为IVF,则默认值3生效。

MAXDEGREE

在 HNSW 图中每个点可以拥有的最大边数。此选项仅在选项TYPE设置为HNSW时生效。

该选项控制了 HNSW 图的稀疏度,以平衡搜索效率和召回率。取值越大,搜索结果越准确,但搜索速度越慢,内存消耗越大。

若未指定该选项且TYPE设置为HNSW,则默认值8生效。

EFCONSTRUCTION

构建 HNSW 图时使用的动态候选列表的大小,该列表大小决定了往图中插入新点时评估的邻居数量。此选项仅在选项TYPE设置为HNSW时生效。

该选项控制了 HNSW 图的质量。取值越大,对潜在邻居的探索越彻底,从而提高搜索的召回率,但会增加构建时间。

若未指定该选项且TYPE设置为HNSW,则默认值16生效。

CAPACITY

在 HNSW 索引中存储的元素数量上限。此选项仅在选项TYPE设置为HNSW时生效。

该选项决定了 HNSW 索引的内存使用量。若超出容量,HNSW 索引会自动调整大小,导致构建 HNSW 索引的开销增加。

若未指定该选项且TYPE设置为HNSW,则默认值10000生效。

示例

以下示例基于 CREATE GRAPH TYPE 中创建的图类型ann_test。

在一个点类型上创建 IVF 向量索引

CREATE GRAPH IF NOT EXISTS ann_test_graph TYPED ann_test    // Create a graph
USE ann_test_graph CREATE VECTOR INDEX IF NOT EXISTS idx_node_vec1 ON NODE N1::vec1 OPTIONS { DIM: 3, METRIC: L2, TYPE: IVF, NLIST: 10, TRAINSIZE: 4 }

该示例在点类型N1上基于属性vec1创建了一个名为idx_node_vec1的 IVF 向量索引。

在一个边类型上创建 HNSW 向量索引

CREATE GRAPH IF NOT EXISTS ann_test_graph TYPED ann_test    // Create a graph
USE ann_test_graph CREATE VECTOR INDEX IF NOT EXISTS idx_edge_vec2 ON EDGE E1::vec2 OPTIONS { DIM: 7, METRIC: IP, TYPE: HNSW, MAXDEGREE: 3, EFCONSTRUCTION: 6, CAPACITY: 500 }

该示例在边类型E1上基于属性vec2创建了一个名为idx_edge_vec2的 HNSW 向量索引。