回到主页Meilisearch 的标志
返回文章
2021年9月23日

排序的艺术

Carolina Ferreira
Carolina FerreiraMeilisearch 开发者布道师@CarolainFG
The art of sorting

如果您还没有听说,Meilisearch v0.22 版本已经发布,并带来了一项备受期待的新功能:搜索时排序。

搜索时排序是指根据查询时确定的参数对结果进行排序。默认情况下,Meilisearch 会根据结果的相关性进行排序,但您可以配置它,让用户在搜索时决定他们想首先看到哪些结果。

让我向您展示此功能的强大之处。如果我想搜索 MacBook 并按价格升序排序结果,我将发送以下查询:

curl 
  -X POST 'http://localhost:7700/indexes/computers/search' 
  --data '{
    "q": "MacBook",
    "sort": [
        "price:asc"
    ]
}'

我也可以反过来,按价格降序搜索。我只需在请求中将 asc 替换为 desc 即可。

旧方法

在 Meilisearch v0.22 之前,您只能使用自定义排序规则对搜索结果进行排序。

多亏了自定义排序规则,我们可以根据我们选择的数字属性对搜索结果进行排序。但是,排序并非在搜索时进行,排序顺序是在我们的索引设置中决定的。

为了在用户界面中更改搜索结果的排序顺序,我们不得不复制索引并为每个索引设置不同的自定义排序规则。

几个月前,我为我们的 MoMA 演示就是这样做的。对于那些不了解的人,MoMA 演示是一个使用现代艺术博物馆在他们的 GitHub 仓库中提供的艺术品数据集创建的 Meilisearch 演示。您可以在这篇博客文章中了解更多关于该演示的信息。我希望用户能够按日期对艺术品进行排序,所以我不得不创建了三个索引:

-  artWorks 采用默认内置排序规则  

- artWorksAsc 采用自定义排序规则进行升序排序

- artWorksDesc 采用自定义排序规则进行降序排序

// Get or create indexes
const artWorksIndex = await client.getOrCreateIndex('artWorks', { primaryKey: 'ObjectID' })
const artWorksAscIndex = await client.getOrCreateIndex('artWorksAsc', { primaryKey: 'ObjectID' })
const artWorksDescIndex = await client.getOrCreateIndex('artWorksDesc', { primaryKey: 'ObjectID' })

const defaultRankingRules = [
  'typo',
  'words',
  'proximity',
  'attribute',
  'exactness'
] 

const rankingRulesAsc = [
  'typo',
  'words',
  'proximity',
  'attribute',
  'exactness',
  'asc(DateToSortBy)' // ascending sort
]
const rankingRulesDesc = [
  'typo',
  'words',
  'proximity',
  'attribute',
  'exactness',
  'desc(DateToSortBy)' // descending sort
]

由于 Meilisearch 的速度极快,这种复制或三倍复制给人一种在搜索时进行排序的印象。

当时,排序功能在我们路线图的“考虑中”标签页下,并且是投票最多的功能之一(86 票)。

我们有一个公开路线图,您可以在其中提交功能或集成想法,并为您支持的现有想法投票。

借助新的 v0.22 排序功能

今天,这已成为现实。我已更新了演示以集成此功能。让我们来看看都改变了什么。

幕后

首先,我在设置中添加了以下一行:

sortableAttributes: ['DateToSortBy']

此添加是必要的,因为我们需要告知 Meilisearch 我们希望用于排序的属性。

我们只需要一个索引(而不是三个)和默认的排序规则。这大大减少了后端代码。您可以更改 sort 规则的位置,以根据您的需要调整搜索结果的相关性。默认情况下,sort 规则位于排序规则的第 5 位,以提升与用户搜索相关的结果。

您可以在此处了解更多关于排序规则及其如何影响相关性的信息。

如果您好奇为什么 sort 规则默认位于第 5 位,您可以查看此 GitHub Issue,我们的产品经理在此解释了此选择。

通过这些修改,上面大段的代码已缩减为以下一行:

// Get or create the index
const index = await client.getOrCreateIndex('artWorks', { primaryKey: 'ObjectID' })

很简单,对吧?那么,前端呢?

焦点

在此演示中,我使用了 Vue InstantSearch,并结合了 Instant Meilisearch。这使得 Meilisearch 实例能够与开源的 InstantSearch 前端工具连接,从而使我们能够轻松自定义搜索环境。

之前的代码如下所示:

<ais-sort-by
:items="[
  { value: 'artWorks', label: 'Featured' },
  { value: 'artWorksAsc', label: 'Date asc.' },
  { value: 'artWorksDesc', label: 'Date desc.' }                    
]"
:class-names="{
    'ais-SortBy': 'MyCustomSortBy'
}"
/>

我只需将其转换为这样:

<ais-sort-by
:items="[
  { value: 'artWorks', label: 'Featured' },
  { value: 'artWorks:DateToSortBy:asc', label: 'Date asc.' },
  { value: 'artWorks:DateToSortBy:desc', label: 'Date desc.' }                    
]"
:class-names="{
  'ais-SortBy': 'MyCustomSortBy'
}"
/>

如您所见,我们不再需要使用 3 个不同的索引(artWorksartWorksAscartworksDesc),而只需在 artWorks 索引后面附加属性名称和所需的排序顺序,即 ascdesc

'artWorks:DateToSortBy:asc'
'artWorks:DateToSortBy:desc'

就是这样。顺畅又简单。您可以在此处进行测试。

带有查询“Magritte”的网络界面,先按升序再按降序日期排序的 GIF

最终用户可能不会注意到差异,但从资源角度来看,它效率更高。

v0.22 的另一个巨大优势是新的索引器。它比以前快得多,所以如果您仍在使用旧版本的 Meilisearch,我强烈建议您升级

演示的源代码可在 GitHub 上获取。我邀请您试用它,只要属性是字符串或数字值,您就可以添加其他属性进行排序。有关排序的更深入解释,请查看文档的专用部分


图片来源:Héctor J. RivasUnsplash 上发布

Meilisearch indexes embeddings 7x faster with binary quantization

Meilisearch 使用二进制量化将嵌入索引速度提高 7 倍

通过与向量存储 Arroy 结合实现二进制量化,在保持搜索相关性和效率的同时,显着减少了大型嵌入的磁盘空间使用和索引时间。

Tamo
Tamo2024年11月29日
How to add AI-powered search to a React app

如何将 AI 驱动的搜索添加到 React 应用

使用 Meilisearch 的 AI 驱动搜索构建一个 React 电影搜索和推荐应用。

Carolina Ferreira
Carolina Ferreira2024年9月24日
Meilisearch is too slow

Meilisearch 太慢了

在这篇博客文章中,我们将探讨 Meilisearch 文档索引器所需的改进。我们将讨论当前的索引引擎、其缺点以及优化性能的新技术。

Clément Renault
Clément Renault2024年8月20日