Skip to Content
存储索引概览

存储索引

存储索引在保持与 NeuG 图存储及事务模型集成的同时,加速查询执行。索引类型由核心引擎或扩展提供,因此本节描述所有存储索引共有的生命周期和行为。

支持的索引类型

NeuG 当前支持以下索引类型:

索引类型使用场景文档
HNSW在向量属性上执行近似最近邻搜索向量搜索
FTS在字符串属性上执行基于 BM25 排序的全文搜索全文搜索

NeuG 计划在未来支持以下索引类型及功能:

  • 针对标量属性的 BTree 索引,支持等值查询、范围查询和有序查询;
  • 复合索引,即同时对多个属性建立索引;
  • 结果重排序(reranking),即使用额外的评分标准对索引候选结果进行重新排序。

下方所述的通用索引语法与保证同样适用于未来新增的索引类型。有关各索引类型所支持的属性、选项及查询表达式,请参阅对应索引类型的文档。

创建索引

使用 CREATE INDEX 在节点属性上构建索引:

CREATE INDEX <index_name> [IF NOT EXISTS] ON <node_table> USING <index_type> (<property>) [WITH ( <option> = <value> [, ...] )];
  • index_name 在数据库内唯一标识该索引。
  • IF NOT EXISTS 可确保当同名索引已存在时,该语句仍能成功执行。
  • node_tableproperty 共同标识被索引的属性。
  • index_type 用于选择索引的具体实现方式。
  • WITH 子句用于传入与具体实现相关的构建选项。

索引创建时,现有数据值将被自动纳入索引;后续的插入、更新和删除操作会同步维护索引及其底层图数据。

删除索引

通过其唯一名称删除索引:

DROP INDEX <index_name> [IF EXISTS];

使用 IF EXISTS 可确保当指定索引不存在时,该语句仍能成功执行。 此外,当被索引的属性或拥有该索引的节点表被删除时,该索引也会一并被删除。

检查索引

使用 SHOW_INDEXES() 查看当前数据库中的索引:

CALL SHOW_INDEXES() RETURN *;

返回结果包含索引名称、类型、节点标签、属性、选项及状态。索引可能处于以下两种状态之一:

  • active(激活):其具体实现已加载,索引可用于查询规划及在线维护。
  • pending(待定):其元数据已恢复,但实现该索引的扩展尚未加载。待提供方扩展加载后,索引即转为激活状态。

待定索引并非后台构建的索引,而是已持久化、正等待其实现可用的索引。

索引加速查询

索引的使用已集成到常规 Cypher 查询中。请根据索引类型,使用 MATCH、过滤或排序表达式以及 LIMIT 编写查询。当存在符合条件且处于启用状态的索引时,查询优化器会将匹配的扫描操作或 Top-K 操作重写为索引扫描。查询无需调用单独的索引搜索过程。

“符合条件”(Eligibility)取决于具体索引类型:

  • HNSW 索引支持在 ORDER BY 子句中识别向量距离表达式;详见 向量相似性搜索
  • 全文搜索(FTS)索引支持识别 bm25 表达式;详见 全文搜索

事务

索引生命周期操作和索引数据变更与图数据变更参与同一事务:

  • CREATE INDEXDROP_INDEX 操作在提交时原子性地对外可见。
  • 插入、更新和删除操作会原子性地修改图属性及其对应的索引条目。
  • 被中止的事务既不会发布图数据变更,也不会发布其对应的索引变更。

因此,读取者无法观察到已提交的图数据与过期的索引数据并存的情形,也无法观察到索引生命周期变更与其关联事务不一致的情形。有关通用 ACID 特性和隔离模型的详细信息,请参阅事务管理

持久化与恢复

索引的元数据和数据均随数据库检查点(checkpoint)一同存储。已提交的索引生命周期管理及维护操作也会被记录在预写式日志(WAL)中。当数据库重新打开时,NeuG 会恢复该检查点,并重放其后的 WAL 记录,从而使已提交的索引随图数据一同恢复。

对于由扩展(extension)支持的索引,恢复过程最初可能将其显示为 pending 状态,这是因为扩展及其函数的生命周期与其所属数据库一致。需在重新打开的数据库中加载对应的提供者扩展(provider extension),方可激活已恢复的索引;详见 扩展(Extensions)

Last updated on