标记化字段中的Titan ES正则表达式查询?

时间:2013-11-16 07:28:42

标签: elasticsearch gremlin titan

我正在运行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有没有办法以这种方式查询索引(正则表达式没有标记化/分析的术语)?

1 个答案:

答案 0 :(得分:2)

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

在即将发布的Titan 0.4.1版本中,我们正在明确这一点。看看更新的文档: https://github.com/thinkaurelius/titan/wiki/Full-Text-and-String-Search

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

Titan 0.4.1目前正在进行最后预览,将于下周发布。