我正在运行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/