【问题标题】:Arango wildcard queryArango 通配符查询
【发布时间】:2021-05-22 15:45:54
【问题描述】:

我正在构建一个简单的 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

【问题讨论】:

    标签: arangodb aql


    【解决方案1】:

    如果您想找到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() 以及尾随通配符 %。第三个示例对用户输入的通配符进行转义。

    【讨论】:

    • 感谢您的建议。关于中间查询的问题,如果只是将查询分解为数组然后我们得到第一个元素,那么在中间查询中使用标记有什么意义,所以只考虑“黑色” ,我理解对了吗?如果我想让 like 语句同时考虑“black”和“kni”怎么办?
    • norm 分析器不进行标记化。换句话说,它不会将输入字符串拆分为单词。它将Black Kni 转换为black kni,将其保留为单个字符串并保留空格。 TOKENS() 因此返回一个带有单个字符串的数组,我将它用于STARTS_WITH()LIKE()。有必要将分析器应用于搜索短语,因为视图也使用此分析器处理 title 属性值。否则很多情况下会不匹配。
    • 感谢您的回复。是否可以使用 arangodb Web 界面创建您建议的上述分析器?如何创建分析器?
    • Web UI 不支持,但您可以使用HTTP APIJS API,通常通过arangosh,如我的回答所示。
    猜你喜欢
    • 1970-01-01
    • 2016-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-26
    相关资源
    最近更新 更多