使用分面搜索

    在 Meilisearch 中,分面是一种特殊的过滤器。本指南将向您展示如何配置分面并在搜索图书数据库时使用它们。它还会指导您如何获得

    要求

    配置分面索引设置

    首先,使用此图书数据集创建一个新索引。此数据集中的文档具有以下字段

    {
      "id": 5,
      "title": "Hard Times",
      "genres": ["Classics","Fiction", "Victorian", "Literature"],
      "publisher": "Penguin Classics",
      "language": "English",
      "author": "Charles Dickens",
      "description":"Hard Times is a novel of social […] ",
      "format": "Hardcover",
      "rating": 3
    }
    

    接下来,将 genreslanguagerating 添加到 filterableAttributes 列表中

    curl \
      -X PUT 'https://127.0.0.1:7700/indexes/books/settings/filterable-attributes' \
      -H 'Content-Type: application/json' \
      --data-binary '[
        "genres", "rating", "language"
      ]'

    您现在已配置索引以使用这些属性作为过滤器。

    在搜索查询中使用分面

    设置 facets 搜索参数进行搜索查询

    curl \
      -X POST 'https://127.0.0.1:7700/indexes/books/search' \
      -H 'Content-Type: application/json' \
      --data-binary '{
        "q": "classic",
        "facets": [
        "genres", "rating", "language"
      ]
    }'

    响应返回所有与查询匹配的书籍。它还会返回两个可用于创建分面搜索界面的字段:facetDistributionfacetStats

    {
      "hits":[],"facetDistribution":{
        "genres":{
          "Classics":6,},
        "language":{
          "English":6,
          "French":1,
          "Spanish":1
        },
        "rating":{
          "2.5":1,}
      },
      "facetStats":{
        "rating":{
          "min":2.5,
          "max":4.7
        }
      }
    }
    

    facetDistribution 列出搜索结果中存在的所有分面,以及每个分面返回的文档数量。

    facetStats 包含所有包含数值的分面的最高值和最低值。

    排序分面值

    默认情况下,所有分面值都按字母数字升序排序。您可以使用faceting 索引设置sortFacetValuesBy 属性来更改此设置

    curl \
      -X PATCH 'https://127.0.0.1:7700/indexes/books/settings/faceting' \
      -H 'Content-Type: application/json' \
      --data-binary '{
        "sortFacetValuesBy": {
          "genres": "count"
      }
    }'

    上面的代码示例按降序值计数对 genres 分面进行排序。

    使用新设置重复之前的查询将导致 facetsDistribution 中出现不同的顺序

    {"facetDistribution": {
        "genres": {
          "Fiction": 8,
          "Literature": 7,
          "Classics": 6,
          "Novel": 2,
          "Horror": 2,
          "Fantasy": 2,
          "Victorian": 2,
          "Vampires": 1,
          "Tragedy": 1,
          "Satire": 1,
          "Romance": 1,
          "Historical Fiction": 1,
          "Coming-of-Age": 1,
          "Comedy": 1
        },}
    }
    

    搜索分面值

    您还可以使用分面搜索端点来搜索分面值。

    curl \
      -X POST 'https://127.0.0.1:7700/indexes/books/facet-search' \
      -H 'Content-Type: application/json' \
      --data-binary '{
        "facetQuery": "c",
        "facetName": "genres"
    }'

    以下代码示例在 genres 分面中搜索以 c 开头的值

    响应包含一个 facetHits 数组,其中列出了所有匹配的分面,以及包含该分面的文档总数

    {"facetHits": [
        {
          "value": "Children's Literature",
          "count": 1
        },
        {
          "value": "Classics",
          "count": 6
        },
        {
          "value": "Comedy",
          "count": 2
        },
        {
          "value": "Coming-of-Age",
          "count": 1
        }
      ],
      "facetQuery": "c",}
    

    您可以使用 qfiltermatchingStrategy 参数进一步优化结果。在 API 参考中了解更多关于它们的信息。