我使用带有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命令检查并确认数据就在那里。我做错了吗?我该如何解决这个问题?
答案 0 :(得分:1)
此错误表示索引尚未ENABLED
。
Titan索引包含INSTALLED
,REGISTERED
,ENABLED
和DISABLED
个州。有关详细信息,请查看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()