Arango 通配符查询

时间:2021-02-19 16:15:52

标签: arangodb aql

我正在构建一个简单的 arango 查询,如果用户输入:“foo bar”(开始输入 Foo Barber),查询将返回结果。我遇到的问题是从普通的单个空格分隔的字符串(即想象顶部的 LET str = "foo barber")到具有多个通配符查询,如下所示。

此外,对其他适用于此的查询开放,例如 LIKE、PHRASE 或类似的查询。

目标是当我们有一个像 'foo bar' 这样的字符串时,返回 Foo Barber 和类似的搜索结果。

    FOR doc IN movies SEARCH PHRASE(doc.name,
[
   {WILDCARD: ["%foo%"]},
   {WILDCARD: ["%bar%"]}
], "text_en") RETURN doc

1 个答案:

答案 0 :(得分:0)

如果您想在搜索词组为 Black Knight 时查找 Knight Black 而不是 black kni,那么您应该避免对诸如 text_en 之类的分析器进行标记。

相反,创建一个 norm 分析器来删除变音符号并允许不区分大小写的搜索。在阿朗戈什:

var analyzers = require("@arangodb/analyzers");
analyzers.save("norm_en", "norm", {"locale": "en_US.utf-8", "accent": false, "case": "lower"}, []);

在所需字段的视图定义中添加分析器(应该是 title 而不是 name,不是吗?)。然后,您应该能够运行如下查询:

  • FOR doc IN movies SEARCH ANALYZER(STARTS_WITH(doc.title, TOKENS("Black Kni", "norm_en")[0]), "norm_en") RETURN doc
  • FOR doc IN movies SEARCH ANALYZER(LIKE(doc.title, TOKENS("Black Kni%", "norm_en")[0]), "norm_en") RETURN doc
  • FOR doc IN movies SEARCH ANALYZER(LIKE(doc.title, CONCAT(TOKENS(SUBSTITUTE("Black Kni", ["%", "_"], ["\\%", "\\_"]), "norm_en")[0], "%")), "norm_en") RETURN doc

搜索短语 Black Kni 被规范化为 black kni,然后用于前缀搜索,使用 STARTS_WITH()LIKE() 和尾随通配符 %。第三个示例转义用户输入的通配符。