对搜索结果进行排序

    默认情况下,Meilisearch 侧重于根据相关性对结果进行排序。您可以更改此排序行为,以便用户可以在搜索时决定首先看到哪种类型的结果。

    这在许多情况下都很有用,例如当用户想在网店中看到最便宜的产品时。

    提示

    当与占位符搜索结合使用时,搜索时的排序会特别有效。

    配置 Meilisearch 以在搜索时进行排序

    要允许用户在搜索时对结果进行排序,您必须

    1. 决定要用于排序的属性
    2. 将这些属性添加到 sortableAttributes 索引设置
    3. 更新 Meilisearch 的排名规则(可选)
    注意

    Meilisearch 基于字符串的字节值按字典顺序对其进行排序。例如,值为 225 的 á 将排在值为 122 的 z 之后。

    大写字母的排序方式与小写字母相同。它们仍将在搜索结果中显示为大写。

    将属性添加到 sortableAttributes

    Meilisearch 允许您根据文档字段对结果进行排序。只有包含数字、字符串、数字值数组和字符串值数组的字段才能用于排序。

    在您决定允许用户根据哪些字段进行排序之后,您必须将它们的属性添加到sortableAttributes 索引设置

    警告

    如果一个字段在不同的文档中具有不同的类型值,Meilisearch 将优先考虑数字而不是字符串。这意味着具有数字字段值的文档的排名将高于具有字符串值的文档。

    这可能会导致排序时出现意外行为。为了获得最佳用户体验,请仅根据包含相同类型值的字段进行排序。

    示例

    假设您有一个包含以下字段的书籍集合

    [
      {
        "id": 1,
        "title": "Solaris",
        "author": "Stanislaw Lem",
        "genres": [
          "science fiction"
        ],
        "rating": {
          "critics": 95,
          "users": 87
        },
        "price": 5.00
      },]
    

    如果您在网上商店中使用此数据集,您可能希望允许用户按 authorprice 进行排序

    curl \
      -X PUT 'https://127.0.0.1:7700/indexes/books/settings/sortable-attributes' \
      -H 'Content-Type: application/json' \
      --data-binary '[
        "author",
        "price"
      ]'

    自定义排名规则顺序(可选)

    当用户在搜索时对结果进行排序时,Meilisearch 的排名规则的设置方式是让最佳匹配优先于排序顺序。您可能需要根据应用程序的需求来更改此行为。

    这是 Meilisearch 排名规则的默认配置

    [
      "words",
      "typo",
      "proximity",
      "attribute",
      "sort",
      "exactness"
    ]
    

    "sort" 排在第五位。这意味着它充当平局打破规则:Meilisearch 将首先将与搜索词密切匹配的结果放在返回的文档列表的顶部,然后才应用用户请求的 "sort" 参数。换句话说,默认情况下,Meilisearch 提供非常相关的排序。

    "sort" 排名规则放在列表中的较高位置将强调详尽排序而不是相关性排序:您的结果将更密切地遵循用户选择的排序顺序,但相关性将不会那么高。

    提升搜索结果和文档置顶

    排序对所有文档都同样适用。Meilisearch 不提供对提升、置顶和增强特定文档的原生支持,以便它们比其他搜索结果更突出地显示。有关使用 React InstantSearch 实现提升的搜索结果文档增强的解决方法,请参阅这些 Meilisearch 博客文章。

    示例

    如果您的用户更关心找到便宜的书籍,而不是关心找到与其查询的特定匹配项,您可以将 sort 在排名规则中放置得更高。

    curl \
      -X PUT 'https://127.0.0.1:7700/indexes/books/settings/ranking-rules' \
      -H 'Content-Type: application/json' \
      --data-binary '[
        "words",
        "sort",
        "typo",
        "proximity",
        "attribute",
        "exactness"
      ]'

    在搜索时对结果进行排序

    配置 sortableAttributes 后,您可以使用sort 搜索参数来控制搜索结果的排序顺序。

    sort 期望一个已添加到 sortableAttributes 列表中的属性列表。

    属性必须以 attribute:sorting_order 的形式给出。换句话说,每个属性后面都必须跟一个冒号 (:) 和一个排序顺序:升序 (asc) 或降序 (desc)。

    使用 POST 路由时,sort 期望一个字符串数组

    "sort": [
      "price:asc",
      "author:desc"
    ]
    

    使用 GET 路由时,sort 期望一个以逗号分隔的字符串

    sort="price:desc,author:asc"
    

    sort 值的顺序很重要:属性在搜索参数值中越高,Meilisearch 将优先于放置较低的属性。在我们的示例中,如果多个文档的 price 值相同,Meilisearch 将根据它们的 author 来决定这些价格相似的文档之间的顺序。

    示例

    假设您在网上商店搜索书籍,并且想要查看最便宜的科幻类书籍。此查询搜索 "science fiction" 书籍,并按从最便宜到最贵的顺序排序

    curl \
      -X POST 'https://127.0.0.1:7700/indexes/books/search' \
      -H 'Content-Type: application/json' \
      --data-binary '{
        "q": "science fiction",
        "sort": ["price:asc"]
      }'

    使用我们的示例数据集,结果如下所示

    [
      {
        "id": 1,
        "title": "Solaris",
        "author": "Stanislaw Lem",
        "genres": [
          "science fiction"
        ],
        "rating": {
          "critics": 95,
          "users": 87
        },
        "price": 5.00
      },
      {
        "id": 2,
        "title": "The Parable of the Sower",
        "author": "Octavia E. Butler",
        "genres": [
          "science fiction"
        ],
        "rating": {
          "critics": 90,
          "users": 92
        },
        "price": 10.00
      }
    ]
    

    按作者姓名搜索书籍是很常见的。sort 可以帮助对同一作者的结果进行分组。此查询将仅返回与查询词 "butler" 匹配的书籍,并根据其作者对结果进行分组

    curl \
      -X POST 'https://127.0.0.1:7700/indexes/books/search' \
      -H 'Content-Type: application/json' \
      --data-binary '{
        "q": "butler",
        "sort": ["author:desc"]
      }'
    [
      {
        "id": 2,
        "title": "The Parable of the Sower",
        "author": "Octavia E. Butler",
        "genres": [
          "science fiction"
        ],
        "rating": {
          "critics": 90,
          "users": 92
        },
        "price": 10.00
      },
      {
        "id": 5,
        "title": "Wild Seed",
        "author": "Octavia E. Butler",
        "genres": [
          "fantasy"
        ],
        "rating": {
          "critics": 84,
          "users": 80
        },
        "price": 5.00
      },
      {
        "id": 4,
        "title": "Gender Trouble",
        "author": "Judith Butler",
        "genres": [
          "feminism",
          "philosophy"
        ],
        "rating": {
          "critics": 86,
          "users": 73
        },
        "price": 10.00
      }
    ]
    

    按嵌套字段排序

    使用点表示法根据文档的嵌套字段对结果进行排序。以下查询按用户评论分数对返回的文档进行排序

    curl \
      -X POST 'https://127.0.0.1:7700/indexes/books/search' \
      -H 'Content-Type: application/json' \
      --data-binary '{
        "q": "science fiction",
        "sort": ["rating.users:asc"]
      }'

    排序和自定义排名规则

    排序和配置自定义排名规则之间有很多重叠之处,因为两者都可以极大地影响用户首先看到哪些结果。

    当您希望用户能够在查询时更改返回结果的顺序时,排序最有用。例如,网上商店用户可能希望根据他们搜索的内容按价格对结果进行排序,并更改他们首先看到最昂贵还是最便宜的产品。

    相反,自定义排名规则会建立在每次搜索中都强制执行的默认排序规则。当您希望将某些结果提升到其他结果之上时,无论用户的偏好如何,此方法都非常有用。例如,您可能希望网上商店始终首先突出显示打折产品,无论用户搜索什么内容。

    示例应用程序

    查看我们的演示,了解如何实现排序的示例