【问题标题】:Tinkerpop API does not use mixed elasticsearch index while retrieving data from titanTinkerpop API 在从 Titan 检索数据时不使用混合弹性搜索索引
【发布时间】:2016-06-20 12:39:41
【问题描述】:

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

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

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

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

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

这可能是什么原因?

【问题讨论】:

  • 你能把你创建混合索引的代码贴出来吗?您是否在同一个架构管理事务中创建了顶点属性name 和混合索引?
  • 你试过graph.traversal().V().has("name", "Apple")吗?

标签: indexing titan mixed tinkerpop3


【解决方案1】:

这是在TinkerPop mailing list 上交叉发布的

首先,如果您要进行精确的字符串匹配,composite index 似乎就可以了。

您应该查看第 20 章中的Titan docs。索引参数和全文搜索。当addKey(name) 没有映射参数时,字符串键的混合索引将默认为全文搜索——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 之间没有改变,所以我不确定您的示例为什么以前有效。

【讨论】:

  • 使用 Mapping.STRING 使属性在弹性搜索中为 not_analyzed,并且我们在属性上的弹性搜索中不区分大小写。在使用 Mapping.STRING 标记属性之前,它允许我们至少在弹性搜索集群中直接进行不区分大小写的搜索。顺便说一句,如何在 Mapping.TEXT 的属性上使用 tinkerpop API 在图形中进行包含搜索。任何例子都会有所帮助。
  • 您在原始问题中没有提到不区分大小写作为要求。使用 Mapping.TEXT.has('name', textContains('apple')) 谓词应该可以工作。请参阅我之前链接的 Titan 1.0.0 要点。它有所有文本谓词的示例。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-16
    • 2016-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-17
    • 2021-02-10
    • 2018-07-21
    相关资源
    最近更新 更多