使用 Elasticsearch 在 Titan 上有序遍历
Ordered Traversal on Titan Using Elasticsearch
当使用 Titan 1.0.0
和 Elasticsearch 作为我的索引后端时,我创建了以下混合索引:
TitanGraph titanGraph = TitanFactory.open("titan-cassandra-es.properties");
TitanManagement management = graph.openManagement();
PropertyKey typeKey = management.makePropertyKey("TYPE").dataType(String.class).make();
PropertyKey degreeKey = management.makePropertyKey("DEGREE").dataType(Long.class).make();
management.buildIndex("byTypeDegree", Vertex.class)
.addKey(typeKey)
.addKey(degreeKey)
.buildMixedIndex("search");
management.commit();
目标是我可以搜索特定 类型 的顶点并使用 度数 对它们进行排序。我相信以下内容应该可以实现这一点:
graph.traversal().V().has("TYPE", "person").order.by("DEGREE");
但是上面的遍历显然没有使用索引,因为我得到以下错误:
Could not execute query since pre-sorting requires fetching more than 1000000 elements. Consider rewriting the query to exploit sort orders
奇怪的是,我已经确认弹性搜索可以非常快速地回答我的查询。直接对 Elasticsearch 使用以下查询:
curl -XGET 'localhost:9200/titan/byTypeDegree/_search?size=80' -d '
{
"sort" : [
{ "DEGREE" : {"order" : "desc"}}
],
"query" : {
"filtered" : {
"filter" : {
"bool" : {
"must" : [
{ "term" : {"TYPE" : "person"}}
]
}
}
}
}
}
我得到了我需要的结果:
"hits": [
"_index": "titan",
"_type": "byTypeDegree",
"_id": "izaqnk",
"_score": null,
"_source": {
"TYPE": "http://mindmaps.io/person",
"DEGREE": 140
},
"sort": [
140
]
},
{
"_index": "titan",
"_type": "byTypeDegree",
"_id": "8j5oxk",
"_score": null,
"_source": {
"TYPE": "http://mindmaps.io/person",
"DEGREE": 112
},
"sort": [
112
]
},
...
那么Titan为什么不能使用索引进行遍历呢?我创建索引不正确还是遍历不正确?
当前有关此问题的问题似乎与 Titan 0.5.x
有关,因此我们将不胜感激。
我已经解决了我的问题。这实际上可能是 Titan 的疏忽。我将索引结构修改为:
TitanGraph titanGraph = TitanFactory.open("titan-cassandra-es.properties");
TitanManagement management = graph.openManagement();
PropertyKey typeKey = management.makePropertyKey("TYPE").dataType(String.class).make();
PropertyKey degreeKey = management.makePropertyKey("DEGREE").dataType(Long.class).make();
management.buildIndex("byTypeDegree", Vertex.class)
.addKey(typeKey, Mapping.STRING.asParameter()))
.addKey(degreeKey)
.buildMixedIndex("search");
management.commit();
通过明确声明 typeKey
是一个 Mapping.STRING.asParameter()
我能够执行遍历:
graph.traversal().V().has("TYPE", "person").order.by("DEGREE");
很快。奇怪的是,当想要在索引数字范围上使用 order().by()
时,这似乎是一个限制。
当使用 Titan 1.0.0
和 Elasticsearch 作为我的索引后端时,我创建了以下混合索引:
TitanGraph titanGraph = TitanFactory.open("titan-cassandra-es.properties");
TitanManagement management = graph.openManagement();
PropertyKey typeKey = management.makePropertyKey("TYPE").dataType(String.class).make();
PropertyKey degreeKey = management.makePropertyKey("DEGREE").dataType(Long.class).make();
management.buildIndex("byTypeDegree", Vertex.class)
.addKey(typeKey)
.addKey(degreeKey)
.buildMixedIndex("search");
management.commit();
目标是我可以搜索特定 类型 的顶点并使用 度数 对它们进行排序。我相信以下内容应该可以实现这一点:
graph.traversal().V().has("TYPE", "person").order.by("DEGREE");
但是上面的遍历显然没有使用索引,因为我得到以下错误:
Could not execute query since pre-sorting requires fetching more than 1000000 elements. Consider rewriting the query to exploit sort orders
奇怪的是,我已经确认弹性搜索可以非常快速地回答我的查询。直接对 Elasticsearch 使用以下查询:
curl -XGET 'localhost:9200/titan/byTypeDegree/_search?size=80' -d '
{
"sort" : [
{ "DEGREE" : {"order" : "desc"}}
],
"query" : {
"filtered" : {
"filter" : {
"bool" : {
"must" : [
{ "term" : {"TYPE" : "person"}}
]
}
}
}
}
}
我得到了我需要的结果:
"hits": [
"_index": "titan",
"_type": "byTypeDegree",
"_id": "izaqnk",
"_score": null,
"_source": {
"TYPE": "http://mindmaps.io/person",
"DEGREE": 140
},
"sort": [
140
]
},
{
"_index": "titan",
"_type": "byTypeDegree",
"_id": "8j5oxk",
"_score": null,
"_source": {
"TYPE": "http://mindmaps.io/person",
"DEGREE": 112
},
"sort": [
112
]
},
...
那么Titan为什么不能使用索引进行遍历呢?我创建索引不正确还是遍历不正确?
当前有关此问题的问题似乎与 Titan 0.5.x
有关,因此我们将不胜感激。
我已经解决了我的问题。这实际上可能是 Titan 的疏忽。我将索引结构修改为:
TitanGraph titanGraph = TitanFactory.open("titan-cassandra-es.properties");
TitanManagement management = graph.openManagement();
PropertyKey typeKey = management.makePropertyKey("TYPE").dataType(String.class).make();
PropertyKey degreeKey = management.makePropertyKey("DEGREE").dataType(Long.class).make();
management.buildIndex("byTypeDegree", Vertex.class)
.addKey(typeKey, Mapping.STRING.asParameter()))
.addKey(degreeKey)
.buildMixedIndex("search");
management.commit();
通过明确声明 typeKey
是一个 Mapping.STRING.asParameter()
我能够执行遍历:
graph.traversal().V().has("TYPE", "person").order.by("DEGREE");
很快。奇怪的是,当想要在索引数字范围上使用 order().by()
时,这似乎是一个限制。