2

Tinkerpop API 在从 Titan 检索数据时不使用混合弹性搜索索引。虽然如果我们直接使用 Titan API,它确实使用混合弹性搜索索引。

例如,我在名称上创建了一个混合索引。

当我们使用 tinkerpop API :graph.iterator().V().has("name", "Apple")时,它不会在“名称”上使用混合索引并给出警告日志“查询需要遍历所有顶点”。

使用titan API,它可以正常工作并使用“名称”上的混合索引,如下所示

titanGraph.query().has("name", "Apple").vertices()

这可能是什么原因?

4

2 回答 2

2

这是在TinkerPop 邮件列表上交叉发布的

首先,如果您要进行精确的字符串匹配,那么复合索引似乎就可以了。

您应该查看第 20 章中的Titan 文档。索引参数和全文搜索。当您addKey(name)没有映射参数时,String 键的混合索引将默认为全文搜索 -- addKey(name, Mapping.TEXT.asParameter())。文档中列出了很多用于全文搜索的陷阱:

  • 该字符串被标记为一个单词包,允许用户有效地查询包含一个或多个单词的所有匹配项。
  • Titan 的默认标记化将字符串拆分为非字母数字字符,并删除少于 2 个字符的任何标记。
  • 索引后端在图形查询中仅支持全文搜索谓词。[ textContains, textContainsPrefix, textContainsRegex]
  • 全文搜索不区分大小写。

您的查询正在尝试进行等式比较,因此可能Mapping.STRINGMapping.TEXTSTRING会更合适。

我创建了几个要点来比较不同的版本。您可以将这些示例剪切并粘贴到 Gremlin 控制台中。

泰坦 0.5.4 https://gist.github.com/pluradj/ff1e1b1bcea0753adbb1

泰坦 1.0.0 https://gist.github.com/pluradj/9bf96f8eae9fa24f3d61

请注意,此行为在 Titan 0.5.4 和 1.0.0 之间没有改变,所以我不确定您的示例为什么以前有效。

于 2016-03-07T18:10:21.943 回答
0

混合 ES 索引存在问题。在 ES 中更新/创建数据存在延迟。因此,如果创建了一条记录,然后立即通过混合索引键查询,我们就不会取回它。请参考Titan 1.0[Berkeley+ES] - ES索引延迟更新

于 2016-04-18T08:37:06.370 回答