筛选表达式参考
filter
搜索参数需要一个筛选表达式。筛选表达式由属性、值和多个运算符组成。
filter
需要一个包含一个或多个条件的筛选表达式。筛选表达式可以写成字符串、数组或两者的混合形式。
数据类型
过滤器接受数值和字符串值。空字段或包含空数组的字段将被忽略。
过滤器不适用于 NaN
和无穷值,如 inf
和 -inf
,因为 JSON 不支持这些值。如果将无穷值和 NaN
值解析为字符串,则可以对其进行筛选,但在处理 _geo
字段时除外。
类型强制转换
为了获得最佳结果,请在字段中强制执行同构类型,尤其是在处理大数字时。Meilisearch 在索引数据时不会强制执行特定的 schema,但筛选引擎可能会强制转换 value
的类型。这可能会导致未定义的行为,例如当大型浮点数被强制转换为整数时。
条件
条件是过滤器的基本构建块。它们以 attribute OPERATOR value
格式编写,其中
attribute
是您要筛选的字段的属性OPERATOR
可以是=
、!=
、>
、>=
、<
、<=
、TO
、EXISTS
、IN
、NOT
、AND
或OR
value
是OPERATOR
应在attribute
中查找的值
示例
一个基本条件,请求 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
字段包含 horror
、comedy
或两者都包含的所有文档
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
) 选择所有不满足条件的文档。它的优先级高于 AND
和 OR
。
以下表达式将返回 genres
字段不包含 horror
的所有文档以及缺少 genres
字段的文档
NOT genres = horror
筛选表达式
您可以通过使用 AND
和 OR
对基本条件进行分组来构建筛选表达式。筛选表达式可以写成字符串、数组或两者的混合形式。
筛选表达式分组运算符
AND
AND
连接两个条件,仅返回满足这两个条件的文档。AND
的优先级高于 OR
。
以下表达式返回与两个条件都匹配的所有文档
genres = horror AND director = 'Jordan Peele'
OR
OR
连接两个条件,并返回满足至少其中一个条件的结果。
以下表达式返回与任一条件匹配的文档
genres = horror OR genres = comedy
使用字符串运算符和括号创建筛选表达式
Meilisearch 从左到右读取字符串表达式。您可以使用括号来确保表达式被正确解析。
例如,如果您希望您的结果仅包含 1995 年 3 月之后发布的 comedy
和 horror
文档,则以下查询中的括号是强制性的
(genres = horror OR genres = comedy) AND release_date > 795484800
未能添加这些括号将导致相同的查询被解析为
genres = horror OR (genres = comedy AND release_date > 795484800)
翻译成英文,以上表达式将仅返回 1995 年 3 月之后发布的喜剧片或恐怖片,而无论其 release_date
如何。
注意
当创建表达式时,如果字段名称或值与筛选运算符(如 AND
或 NOT
)相同时,您必须将其括在引号中:title = "NOT" OR title = "AND"
。
使用数组创建筛选表达式
数组表达式通过嵌套字符串数组来建立逻辑连接。数组筛选器的最大深度为两层。 具有三层或更多层嵌套的表达式将抛出错误。
外部数组元素由 AND
运算符连接。以下表达式返回由 Jordan Peele
执导的 horror
电影
["genres = horror", "director = 'Jordan Peele'"]
内部数组元素由 OR
运算符连接。以下表达式返回 horror
或 comedy
电影
[["genres = horror", "genres = comedy"]]
内部和外部数组可以自由组合。以下表达式返回由 Jordan Peele
执导的 horror
和 comedy
电影
[["genres = horror", "genres = comedy"], "director = 'Jordan Peele'"]
组合数组和字符串运算符
您还可以创建同时使用数组和字符串语法的筛选表达式。
以下筛选器写成字符串,仅返回不由 Jordan Peele
执导且属于 comedy
或 horror
类型的电影
"(genres = comedy OR genres = horror) AND director != 'Jordan Peele'"
您可以编写相同的筛选器,混合使用数组和字符串
[["genres = comedy", "genres = horror"], "NOT director = 'Jordan Peele'"]