默认情况下,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 'MEILISEARCH_URL/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 'MEILISEARCH_URL/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 'MEILISEARCH_URL/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 'MEILISEARCH_URL/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 'MEILISEARCH_URL/indexes/books/search' \
  -H 'Content-Type: application/json' \
  --data-binary '{
    "q": "science fiction",
    "sort": ["rating.users:asc"]
  }'

排序和自定义排名规则

排序和配置自定义排名规则之间有很多重叠,因为两者都可以在很大程度上影响用户首先看到哪些结果。 当您希望用户能够在查询时更改返回结果的顺序时,排序最有用。例如,网店用户可能希望根据他们正在搜索的内容按价格排序结果,并更改他们是首先看到最贵的产品还是最便宜的产品。 相反,自定义排名规则建立了一个默认排序规则,该规则在每次搜索中都强制执行。当您希望在所有其他结果之上推广某些结果时,无论用户的偏好如何,这种方法都很有用。例如,您可能希望网店始终首先显示打折产品,无论用户正在搜索什么。

示例应用程序

请查看我们的演示,了解如何实现排序的示例
© . This site is unofficial and not affiliated with Meilisearch.