本指南将向您展示如何在假想的电影数据库中配置和使用 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 'MEILISEARCH_URL/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 'MEILISEARCH_URL/indexes/movie_ratings/search' \
  -H 'Content-Type: application/json' \
  --data-binary '{
    "q": "Avengers",
    "filter": "release_date > 795484800"
  }'

使用点符号根据文档的嵌套字段筛选结果。以下查询仅返回用户评价良好的惊悚片

curl \
  -X POST 'MEILISEARCH_URL/indexes/movie_ratings/search' \
  -H 'Content-Type: application/json' \
  --data-binary '{
    "q": "thriller",
    "filter": "rating.users >= 90"
  }'

您也可以组合多个条件。例如,您可以限制搜索,使其仅包含由 Tim BurtonChristopher Nolan 执导的 Batman 电影

curl \
  -X POST 'MEILISEARCH_URL/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 'MEILISEARCH_URL/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\")"
  }' \
release_date > 1577884550 AND (NOT director = "Tim Burton" AND director EXISTS)

同义词不适用于筛选器。这意味着,如果您将 SFSan Francisco 设置为同义词,通过 SFSan Francisco 筛选将显示不同的结果。