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

我已经为我的ES索引my_key创建了一个关于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中是否可以通过这种方式(不带标记化/分析术语的正则表达式)查询索引?

最佳答案

在Titan中直到0.4.0为止,这种处理方式可能会有些混乱,因为在外部索引后端中对字符串进行索引时,它们始终会被标记化。这导致字符串被“分块”为单词,非字母字符(以及停用词)将被忽略。

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

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

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

关于elasticsearch - 跨 token 化字段的Titan ES正则表达式查询?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20015977/

10-13 02:11