1

我正在运行 Titan 0.4.0 并尝试使用最新的REGEX运算符进行 ES 字符串搜索。

my_key为我的 ES 索引创建了一个名为search.

gremlin> g.makeKey("my_key").dataType(String.class).indexed("search",Vertex.class).single().make()
==>v[82]

然后我添加一个顶点:

gremlin> v = g.addVertex(null, ["my_key":"123-abc"])
==>v[8]
gremlin> v.map
==>{my_key=123-abc}

似乎REGEX工作...

gremlin> g.query().has("my_key", REGEX, "[12]{2}3").vertices()
==>v[8]

...但仅在我的标记化"123""abc"独立上:

gremlin> g.query().has("my_key", REGEX, "123").vertices()
==>v[8]
gremlin> g.query().has("my_key", REGEX, "abc").vertices()
==>v[8]

但是,如果我尝试运行与我的完整值匹配的正则表达式,则不会检索到我的顶点(以下均未返回结果):

gremlin> g.query().has("my_key", REGEX, "123-abc").vertices()
gremlin> g.query().has("my_key", REGEX, "123.abc").vertices()
gremlin> g.query().has("my_key", REGEX, "[0-9]+.[abc]{3}").vertices()
gremlin> g.query().has("my_key", REGEX, "123.").vertices()

Titan中有没有办法以这种方式查询索引(正则表达式不带标记/分析的术语)?

4

1 回答 1

2

直到 0.4.0 为止,在 Titan 中处理这种情况的方式可能有点令人困惑,因为字符串在外部索引后端中被索引时总是被标记化。这导致字符串被“分块”成单词,而忽略非字母字符(以及停用词)。

在即将发布的 Titan 0.4.1 版本中,我们对此进行了更明确的说明。查看更新的文档: https ://github.com/thinkaurelius/titan/wiki/Full-Text-and-String-Search

要点:您现在可以指定是希望您的字符串“按原样”索引,还是在分析后作为一个词包索引。对于您的用例,它将是前者。我们还理顺了术语:如果您要在字符串中查找与正则表达式匹配的单词,则使用谓词 Text.CONTAINS_REGEX。如果您希望整个字符串与表达式匹配,请使用 Text.REGEX。

Titan 0.4.1 目前处于最终预览阶段,将于下周发布。

于 2013-11-19T19:45:44.357 回答