索引生命周期
JanusGraph 只使用状态为 ENABLED 的索引。当索引被创建时,JanusGraph 不会使用它,直到它被启用。索引构建完成后,您应该等待它被 JanusGraph 注册(即可用)。
//Wait for the index to become available (i.e. wait for status REGISTERED)
ManagementSystem.awaitGraphIndexStatus(graph, "myIndex").call();
索引注册后,我们应该要么启用索引(如果我们确定当前数据不应该被新创建的索引索引),要么重新索引当前数据,使其在新创建的索引中可用。
重新索引现有数据并自动启用索引示例
mgmt = graph.openManagement();
mgmt.updateIndex(mgmt.getGraphIndex("myIndex"), SchemaAction.REINDEX).get();
mgmt.commit();
不重新索引现有数据而启用索引示例
mgmt = graph.openManagement();
mgmt.updateIndex(mgmt.getGraphIndex("myAnotherIndex"), SchemaAction.ENABLE_INDEX).get();
mgmt.commit();
索引状态和转换
下图显示了 JanusGraph 中索引的可能状态。应谨慎使用的转换以灰色显示。这些要不不建议在生产环境中使用,要不具有需要注意的更复杂的含义。
状态 (SchemaStatus)
索引可以处于以下状态之一
- INSTALLED(已安装)
-
索引已在当前 JanusGraph 实例上创建,但尚未被集群中的所有实例知晓。此状态未在上图中显示,因为它在实例间同步方面不稳定。
- REGISTERED(已注册)
-
索引已被集群中的所有实例知晓。但是,它尚未投入使用。在此状态下,索引不包含任何数据,也不会在查询中使用。
- ENABLED(已启用)
-
索引已启用,可用于回答查询。此外,这是图中的插入和删除操作转发到索引的唯一状态。
- DISABLED(已禁用)
-
索引已禁用,不会用于回答查询。它也不再接收图更新。因此,建议使用
REINDEX重新启用索引。 - DISCARDED(已废弃)
-
索引已被停用,其内容已被删除。唯一剩余的工件是表示索引的模式顶点。
操作 (SchemaAction)
可以通过 mgmt.updateIndex() 对索引执行以下操作以更改其状态
- REGISTER_INDEX(注册索引)
- 将索引注册到集群中的所有实例。索引安装后,必须将其注册到所有 JanusGraph 实例。
- REINDEX(重新索引)
- 使用图中存储的数据从头开始重新构建索引。根据图的大小,此操作可能需要很长时间才能完成。重新索引在所有稳定状态下都是可能的,并在完成后自动启用索引。
- ENABLE_INDEX(启用索引)
- 启用索引,以便查询处理引擎可以使用它。索引必须先注册才能启用。如果手动启用索引而不是执行重新索引,请注意图的过去修改不会在索引中表示。在不使用
REINDEX的情况下启用先前禁用的索引可能会导致索引查询返回“幽灵”顶点,这些顶点在索引禁用时已从图中删除。 - DISABLE_INDEX(禁用索引)
- 临时禁用索引,使其不再用于回答查询。索引也停止接收图中的更新。
- DISCARD_INDEX(废弃索引)
- 从索引中删除所有数据,为删除做准备。此操作支持所有复合索引和某些混合索引后端。有关索引删除的更多信息,请参阅删除。
- MARK_DISCARDED(标记为废弃)
- 所有不能使用 DISCARD_INDEX 废弃的索引都必须在后端手动废弃。由于 JanusGraph 不会自动识别这一点,因此可以通过此操作手动将状态设置为 DISCARDED。
- DROP_INDEX(删除索引)
- 从模式中删除索引,并将更改通知集群中的其他实例。索引删除后,允许新索引再次使用相同的名称。