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
- ann_index_option
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:使用 IVF(全称 Inverted File)算法创建索引。HNSW:使用 HNSW(全称 Hierarchical Navigable Small World)算法创建索引。
若未指定该选项,则默认值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 向量索引。