筛选表达式参考

    filter 搜索参数需要一个筛选表达式。筛选表达式由属性、值和多个运算符组成。

    filter 需要一个包含一个或多个条件筛选表达式。筛选表达式可以写成字符串、数组或两者的混合形式。

    数据类型

    过滤器接受数值和字符串值。空字段或包含空数组的字段将被忽略。

    过滤器不适用于 NaN 和无穷值,如 inf-inf,因为 JSON 不支持这些值。如果将无穷值和 NaN 值解析为字符串,则可以对其进行筛选,但在处理 _geo 字段时除外。

    类型强制转换

    为了获得最佳结果,请在字段中强制执行同构类型,尤其是在处理大数字时。Meilisearch 在索引数据时不会强制执行特定的 schema,但筛选引擎可能会强制转换 value 的类型。这可能会导致未定义的行为,例如当大型浮点数被强制转换为整数时。

    条件

    条件是过滤器的基本构建块。它们以 attribute OPERATOR value 格式编写,其中

    示例

    一个基本条件,请求 genres 属性等于 horror 的电影

    genres = horror
    

    包含空格的字符串值必须用单引号或双引号括起来

    director = 'Jordan Peele'
    director = "Tim Burton"
    

    筛选运算符

    相等 (=)

    相等运算符 (=) 返回所有对于给定属性包含特定值的文档

    genres = action
    

    在字符串上操作时,= 是不区分大小写的。

    相等运算符不会为 null 和空数组返回任何结果。

    不等 (!=)

    不等运算符 (!=) 返回所有未被相等运算符选中的文档。在字符串上操作时,!= 是不区分大小写的。

    以下表达式返回所有不包含 action 类型电影的文档

    genres != action
    

    比较 (>, <, >=, <=)

    比较运算符 (>, <, >=, <=) 选择满足比较条件的文档。比较运算符仅适用于数值。

    以下表达式返回所有用户评分高于 85 的文档

    rating.users > 85
    

    TO

    TO 等价于 >= AND <=。以下表达式返回所有评分在 80 或以上但在 90 以下的文档

    rating.users 80 TO 89
    

    EXISTS

    EXISTS 运算符检查字段是否存在。具有空值或 null 值的字段也算作存在。

    以下表达式返回所有包含 release_date 字段的文档

    release_date EXISTS
    

    上述表达式的否定形式可以用两种等效的方式编写

    release_date NOT EXISTS
    NOT release_date EXISTS
    

    IS EMPTY

    IS EMPTY 运算符选择指定的属性存在但包含空值的文档。以下表达式仅返回 overview 字段为空的文档

    overview IS EMPTY
    

    IS EMPTY 匹配以下 JSON 值

    Meilisearch 不会将 null 值视为空值。要匹配 null 字段,请使用 IS NULL 运算符。

    使用 NOT 构建 IS EMPTY 的否定形式

    overview IS NOT EMPTY
    NOT overview IS EMPTY
    

    IS NULL

    IS NULL 运算符选择指定的属性存在但包含 null 值的文档。以下表达式仅返回 overview 字段为 null 的文档

    overview IS NULL
    

    使用 NOT 构建 IS NULL 的否定形式

    overview IS NOT NULL
    NOT overview IS NULL
    

    IN

    IN 运算符结合相等运算符,它接受一个由方括号分隔的逗号分隔值数组。它选择字段包含至少一个指定值的所有文档。

    以下表达式返回 genres 字段包含 horrorcomedy 或两者都包含的所有文档

    genres IN [horror, comedy]
    genres = horror OR genres = comedy
    

    上述表达式的否定形式可以写成:

    genres NOT IN [horror, comedy]
    NOT genres IN [horror, comedy]
    

    CONTAINS experimental

    CONTAINS 筛选结果,以查找与指定字符串模式部分匹配的内容,类似于 SQL LIKE

    以下表达式返回名称中包含 "kef" 的所有乳制品

    dairy_products.name CONTAINS kef
    

    上述表达式的否定形式可以写成:

    dairy_products.name NOT CONTAINS kef
    NOT dairy_product.name CONTAINS kef
    
    激活 CONTAINS

    这是一个实验性功能。使用实验性功能端点来激活它

    curl \
      -X PATCH 'MEILISEARCH_URL/experimental-features/' \
      -H 'Content-Type: application/json' \
      --data-binary '{
        "containsFilter": true
      }'
    

    这也将启用 STARTS WITH 运算符。

    STARTS WITH experimental

    STARTS WITH 筛选值以指定字符串模式开头的结果。

    以下表达式返回名称以 "kef" 开头的所有乳制品

    dairy_products.name STARTS WITH kef
    

    上述表达式的否定形式可以写成:

    dairy_products.name NOT STARTS WITH kef
    NOT dairy_product.name STARTS WITH kef
    
    激活 STARTS WITH

    这是一个实验性功能。使用实验性功能端点来激活它

    curl \
      -X PATCH 'MEILISEARCH_URL/experimental-features/' \
      -H 'Content-Type: application/json' \
      --data-binary '{
        "containsFilter": true
      }'
    

    这也将启用 CONTAINS 运算符。

    NOT

    否定运算符 (NOT) 选择所有不满足条件的文档。它的优先级高于 ANDOR

    以下表达式将返回 genres 字段不包含 horror 的所有文档以及缺少 genres 字段的文档

    NOT genres = horror
    

    筛选表达式

    您可以通过使用 ANDOR 对基本条件进行分组来构建筛选表达式。筛选表达式可以写成字符串、数组或两者的混合形式。

    筛选表达式分组运算符

    AND

    AND 连接两个条件,仅返回满足这两个条件的文档。AND 的优先级高于 OR

    以下表达式返回与两个条件都匹配的所有文档

    genres = horror AND director = 'Jordan Peele'
    

    OR

    OR 连接两个条件,并返回满足至少其中一个条件的结果。

    以下表达式返回与任一条件匹配的文档

    genres = horror OR genres = comedy
    

    使用字符串运算符和括号创建筛选表达式

    Meilisearch 从左到右读取字符串表达式。您可以使用括号来确保表达式被正确解析。

    例如,如果您希望您的结果仅包含 1995 年 3 月之后发布的 comedyhorror 文档,则以下查询中的括号是强制性的

    (genres = horror OR genres = comedy) AND release_date > 795484800
    

    未能添加这些括号将导致相同的查询被解析为

    genres = horror OR (genres = comedy AND release_date > 795484800)
    

    翻译成英文,以上表达式将仅返回 1995 年 3 月之后发布的喜剧片或恐怖片,而无论其 release_date 如何。

    注意

    当创建表达式时,如果字段名称或值与筛选运算符(如 ANDNOT)相同时,您必须将其括在引号中:title = "NOT" OR title = "AND"

    使用数组创建筛选表达式

    数组表达式通过嵌套字符串数组来建立逻辑连接。数组筛选器的最大深度为两层。 具有三层或更多层嵌套的表达式将抛出错误。

    外部数组元素由 AND 运算符连接。以下表达式返回由 Jordan Peele 执导的 horror 电影

    ["genres = horror", "director = 'Jordan Peele'"]
    

    内部数组元素由 OR 运算符连接。以下表达式返回 horrorcomedy 电影

    [["genres = horror", "genres = comedy"]]
    

    内部和外部数组可以自由组合。以下表达式返回由 Jordan Peele 执导的 horrorcomedy 电影

    [["genres = horror", "genres = comedy"], "director = 'Jordan Peele'"]
    

    组合数组和字符串运算符

    您还可以创建同时使用数组和字符串语法的筛选表达式。

    以下筛选器写成字符串,仅返回不由 Jordan Peele 执导且属于 comedyhorror 类型的电影

    "(genres = comedy OR genres = horror) AND director != 'Jordan Peele'"
    

    您可以编写相同的筛选器,混合使用数组和字符串

    [["genres = comedy", "genres = horror"], "NOT director = 'Jordan Peele'"]