【问题标题】:TitanDB Defining and Using IndexesTitanDB 定义和使用索引
【发布时间】:2015-11-24 20:06:32
【问题描述】:

使用this。我正在构建以下索引:

TitanManagement management = graph.openManagement();

PropertyKey key = management.makePropertyKey("ITEM_IDENTIFIER").dataType(String.class).make();

management.buildIndex("byItemIdentifier", Vertex.class).addKey(key).buildCompositeIndex();

management.commit();

但是,当我运行以下查询时:

graph.traversal().V().has("ITEM_IDENTIFIER", "Test");

我仍然收到警告:

Query requires iterating over all vertices [(ITEM_IDENTIFIER = Test)]. For better performance, use indexes

如何让 TitanDB 使用索引来加快查找速度?

【问题讨论】:

    标签: java titan tinkerpop


    【解决方案1】:

    所以我设法找出了问题所在。感谢this answer 提供更多信息。

    问题是我以为我会使用CompositeIndex,但在仔细阅读Chapter 20、Chapter 22 和Chapter 28 之后,我实际上错了。基于String 的索引需要MixedIndex。

    要让 MisedIndexes 使用字符串,我必须首先安装 Elasticsearch 以启用基于 String 的索引。然后我可以通过替换来配置我的索引:

    management.buildIndex("byItemIdentifier", Vertex.class).addKey(key).buildCompositeIndex();
    

    与

    management.buildIndex("byItemIdentifier", Vertex.class).addKey(key, Mapping.STRING.asParameter()).buildMixedIndex("search");
    

    执行此操作后,警告消失了。我将进行更多测试以确认这是否有效,但现在这似乎已经解决了我的问题。

    【讨论】:

      【解决方案2】:

      您的索引定义看起来合理,但有几个原因可能不使用该索引,您应该检查一下。

      索引必须完成构建。

      mgmt.awaitGraphIndexStatus(graph, "byItemIdentifier").call()
      

      或者您需要重新索引现有数据

      mgmt.updateIndex(mgmt.getGraphIndex("byItemIdentifier"), SchemaAction.REINDEX).get()
      

      请注意,后面的操作应该在事务中完成。

      【讨论】:

      • 这对我有点帮助。当我等待状态 mgmt.awaitGraphIndexStatus(graph, "byItemIdentifier").call() 时,我的应用程序停止并显示以下消息 Some key(s) on index byItemIdentifier do not currently have status REGISTERED: ITEM_IDENTIFIER=ENABLED。所以问题出在钥匙上。
      • 为有用的信息投票,但解决方案需要不同的方法。感谢您的帮助。
      猜你喜欢
      • 2016-01-23
      • 2016-04-11
      • 2016-04-04
      • 2016-09-14
      • 2010-11-30
      • 1970-01-01
      • 2016-02-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多