Titan 1.0混合索引无法使用警告 - 查询需要迭代所有顶点

时间:2016-06-01 08:50:05

标签: elasticsearch indexing titan tinkerpop3

我使用带有elasticsearch的Titan 1.0作为后端。 从titan文档中,我了解到使用elasticsearch时,我们在构建索引时使用mixedIndex。 这是我的用例和问题: 我正在为书店的注册数据创建图表数据库,我有注册时间的数据,以及其他个人信息,如姓名和年龄。我想查询在给定时间范围内注册的所有用户,换句话说,我想要查询的数字比较函数。这就是我创建索引的方式:

PropertyKey propertyKey = mgmt.makePropertyKey("registTime").dataType(Date.class)
    .cardinality(Cardinality.SINGLE).make()

timeIndex = mgmt.buildIndex("registeredTime",Vertex.class)
    .addKey("registTime", Mapping.TEXTSTRING.asParameter())
    .buildMixedIndex("search");

成功创建了timeIndex,但是,当我想用​​以下内容查询注册时间时:

g.V().has("registTime", gt("2015-01-01 00:00:00.000+0000"))
它给了我:

WARN  com.thinkaurelius.titan.graphdb.transaction.StandardTitanTx  - Query requires iterating over all vertices [()]. For better performance, use indexes

它给了我一个空的结果,虽然我用gremlin命令检查并确认数据就在那里。我做错了吗?我该如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

此错误表示索引尚未ENABLED

Titan索引包含INSTALLEDREGISTEREDENABLEDDISABLED个州。有关详细信息,请查看here

您需要在使用之前将索引状态设置为ENABLED。否则,你会得到这个警告。

这是启用索引的方法。

mgmt = graph.openManagement()
mgmt.updateIndex(mgmt.getGraphIndex("registeredTime"), SchemaAction.ENABLE).get()
mgmt.commit()

然后等待它直到它切换,

ManagementSystem.awaitGraphIndexStatus(graph, propertyKeyIndexName)
                    .status(SchemaStatus.ENABLED)
                    .timeout(10, ChronoUnit.MINUTES) // set timeout to 10 min
                    .call();

因此,从现在开始,所有添加的数据都将被编入索引。如果您想索引已添加的数据:

mgmt = graph.openManagement()
mgmt.updateIndex(mgmt.getGraphIndex("registeredTime"), SchemaAction.REINDEX).get()
mgmt.commit()

如需更多信息,请阅读docs herehere