筛选搜索结果
在本指南中,您将了解如何在假设的电影数据库中配置和使用 Meilisearch 过滤器。
配置索引设置
假设您有一个名为 movie_ratings
的电影集合,其中包含以下字段
[
{
"id": 458723,
"title": "Us",
"director": "Jordan Peele",
"release_date": 1552521600,
"genres": [
"Thriller",
"Horror",
"Mystery"
],
"rating": {
"critics": 86,
"users": 73
},
},
…
]
如果要根据某个属性筛选结果,必须首先将其添加到 filterableAttributes
列表中
curl \
-X PUT 'https://127.0.0.1:7700/indexes/movie_ratings/settings/filterable-attributes' \
-H 'Content-Type: application/json' \
--data-binary '[
"genres",
"director",
"release_date",
"ratings"
]'
此步骤是强制性的,不能在搜索时完成。更新 filterableAttributes
需要 Meilisearch 重新索引您的所有数据,这将花费与您的数据集大小和复杂性成正比的时间。
注意
默认情况下,filterableAttributes
为空。如果没有首先将属性显式添加到 filterableAttributes
列表中,过滤器将不起作用。
搜索时使用 filter
在更新 filterableAttributes
索引设置后,可以使用 filter
来微调搜索结果。
filter
是您可以在搜索时使用的搜索参数。filter
接受使用 filterableAttributes
列表中存在的任何属性构建的过滤器表达式。
以下代码示例返回 1995 年 3 月 18 日之后上映的 Avengers
电影
curl \
-X POST 'https://127.0.0.1:7700/indexes/movie_ratings/search' \
-H 'Content-Type: application/json' \
--data-binary '{
"q": "Avengers",
"filter": "release_date > 795484800"
}'
使用点表示法基于文档的嵌套字段来过滤结果。以下查询仅返回用户评价良好的惊悚片
curl \
-X POST 'https://127.0.0.1:7700/indexes/movie_ratings/search' \
-H 'Content-Type: application/json' \
--data-binary '{
"q": "thriller",
"filter": "rating.users >= 90"
}'
您还可以组合多个条件。例如,您可以限制搜索,使其仅包括由 Tim Burton
或 Christopher Nolan
执导的 Batman
电影
curl \
-X POST 'https://127.0.0.1:7700/indexes/movie_ratings/search' \
-H 'Content-Type: application/json' \
--data-binary '{
"q": "Batman",
"filter": "release_date > 795484800 AND (director = \"Tim Burton\" OR director = \"Christopher Nolan\")"
}'
在这里,括号是强制性的:如果没有括号,过滤器将返回由 Tim Burton
执导且在 1995 年之后发行的电影,或者由 Christopher Nolan
执导的任何电影,而对其发行日期没有限制。这是因为 AND
的优先级高于 OR
。
如果您只想查找最近的且不是由 Tim Burton
执导的 Planet of the Apes
电影,您可以使用此过滤器
curl \
-X POST 'https://127.0.0.1:7700/indexes/movie_ratings/search' \
-H 'Content-Type: application/json' \
--data-binary '{
"q": "Planet of the Apes",
"filter": "release_date > 1577884550 AND (NOT director = \"Tim Burton\")"
}' \
NOT director = "Tim Burton"
将包括 director
字段中不包含 "Tim Burton"
的文档,以及没有 director
字段的文档。要仅返回具有 director
字段的文档,请使用 EXISTS
运算符扩展过滤器表达式
release_date > 1577884550 AND (NOT director = "Tim Burton" AND director EXISTS)
警告
同义词不适用于过滤器。这意味着,如果您将 SF
和 San Francisco
设置为同义词,则按 SF
和 San Francisco
进行过滤将显示不同的结果。