存储索引
存储索引在保持与 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_table和property共同标识被索引的属性。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)取决于具体索引类型:
事务
索引生命周期操作和索引数据变更与图数据变更参与同一事务:
CREATE INDEX和DROP_INDEX操作在提交时原子性地对外可见。- 插入、更新和删除操作会原子性地修改图属性及其对应的索引条目。
- 被中止的事务既不会发布图数据变更,也不会发布其对应的索引变更。
因此,读取者无法观察到已提交的图数据与过期的索引数据并存的情形,也无法观察到索引生命周期变更与其关联事务不一致的情形。有关通用 ACID 特性和隔离模型的详细信息,请参阅事务管理。
持久化与恢复
索引的元数据和数据均随数据库检查点(checkpoint)一同存储。已提交的索引生命周期管理及维护操作也会被记录在预写式日志(WAL)中。当数据库重新打开时,NeuG 会恢复该检查点,并重放其后的 WAL 记录,从而使已提交的索引随图数据一同恢复。
对于由扩展(extension)支持的索引,恢复过程最初可能将其显示为 pending 状态,这是因为扩展及其函数的生命周期与其所属数据库一致。需在重新打开的数据库中加载对应的提供者扩展(provider extension),方可激活已恢复的索引;详见 扩展(Extensions)。