对搜索结果进行排序
默认情况下,Meilisearch 侧重于根据结果的相关性对其进行排序。您可以更改此排序行为,以便用户可以在搜索时决定他们希望首先看到哪种类型的结果。
这在许多情况下都很有用,例如,当用户想要查看网上商店中最便宜的产品时。
提示
当与占位符搜索结合使用时,搜索时的排序可能特别有效。
配置 Meilisearch 以在搜索时进行排序
要允许您的用户在搜索时对结果进行排序,您必须
- 确定您要用于排序的属性
- 将这些属性添加到
sortableAttributes
索引设置 - 更新 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
},
…
]
如果您在网上商店中使用此数据集,您可能希望允许用户按 author
和 price
排序
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"]
}'
排序和自定义排名规则
排序和配置 自定义排名规则 之间有很多重叠之处,因为两者都会极大地影响用户首先看到哪些结果。
当您希望用户能够在查询时更改返回结果的顺序时,排序最有用。例如,网上商店用户可能希望根据他们搜索的内容按价格对结果进行排序,并更改他们首先看到最昂贵还是最便宜的产品。
相比之下,自定义排名规则建立了一个默认的排序规则,该规则在每次搜索中都会强制执行。当您想要将某些结果提升到所有其他结果之上,而不管用户的偏好如何时,这种方法可能很有用。例如,您可能希望网上商店始终首先展示打折商品,无论用户搜索什么。
示例应用
查看我们的演示,了解如何实现排序的示例