在本指南中,您将了解如何在假设的电影数据库中配置和使用 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 过滤将显示不同的结果。
© . This site is unofficial and not affiliated with Meilisearch.