使用 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() 时,这似乎是一个限制。