Titan es regex查询跨标记化字段?
-
21-12-2019 - |
题
我正在运行Titan0.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中是否有办法以这种方式查询索引(正则表达式w/o标记化/分析术语)?
解决方案
在Titan中直到0.4.0的处理方式可能有点令人困惑,因为字符串在外部索引后端进行索引时总是标记化。这导致字符串被"分块"成单词,非字母字符(以及停用词)被忽略。
在即将发布的泰坦0.4.1版本中,我们将更加明确地说明这一点。查看更新的文档:https://github.com/thinkaurelius/titan/wiki/Full-Text-and-String-Search
要点:您现在可以指定您的字符串是"按原样"索引,还是在分析后作为一袋单词索引。对于您的用例,它将是前者。我们还理顺了术语:如果您正在查找匹配正则表达式的字符串中的单词,谓词文本。使用CONTAINS_REGEX。如果希望整个字符串与表达式匹配,请使用文本。正则表达式。
Titan0.4.1目前处于最终预览版,将于下周发布。
不隶属于 StackOverflow