您是否返回了用户想要的搜索结果?
了解如何通过自定义 Meilisearch 的匹配策略来优化搜索结果的相关性。

Meilisearch v0.29 发布了,并带来了一个新功能:匹配策略自定义!
考虑以下情况:用户发送一个包含两个词的搜索请求。当没有足够的文档来满足请求的 limit
时会发生什么?引擎应该只返回包含所有查询词的文档吗?还是应该返回更多文档?如果是这样,应该应用哪些标准来返回它们?
这就是匹配策略的用武之地。当引擎没有找到足够包含所有查询词的文档时,匹配策略用于匹配查询词。做出决定并不容易,而且很大程度上取决于用户搜索的数据类型。幸运的是,现在您可以在搜索时选择要应用的策略 🎉
一点历史
早在 2021 年,v0.21 之前的所有版本都只返回文档中存在所有查询词的文档。因此,如果我搜索“Peter Parker”,它只会返回同时包含 “peter” 和 “parker” 这两个词的文档。这种匹配策略被称为:all
,因为文档要返回,就必须存在所有查询词。
排名规则 是 Meilisearch 用于确保相关结果的最重要功能之一。words 排名规则说明如下:
结果按匹配的查询词数量降序排序。首先返回包含所有查询词的文档。
这条规则已经在我们的文档中存在一段时间了,并附带以下警告消息:
目前,必须在返回的文档中存在所有查询词。因此,此规则尚不影响搜索结果。
在 v0.21 版本中,words 规则开始生效,因此此警告随着所有查询词都必须存在的约束而消失了。
从那时起,如果没有足够的文档包含所有查询词,Meilisearch 会一次删除一个词,从查询的末尾开始删除。因此,如果我搜索 “Peter Parker”,它会首先返回同时包含这两个词的文档,然后是只包含 “Peter” 的文档。
这种类型的匹配策略称为 last
,因为 Meilisearch 会删除查询的最后一个词。
事实证明,许多用户对之前的匹配行为非常满意。不幸的是,此更改不允许他们迁移到较新版本的 Meilisearch,这阻止了他们从其许多改进中受益:搜索时排序、地理搜索、细粒度的 API 密钥权限、多租户等等。他们不仅错过了所有这些,而且还将错过所有即将推出的超棒功能!😱
别慌!0.29 版本前来救援!
闭环反馈
现在,可以在搜索时选择您想要的匹配策略。默认策略是 last
;如果您想使用 all
,您只需要在搜索正文中指定它,如下所示:
curl -X POST 'http://localhost:7700/indexes/movies/search' -H 'Content-Type: application/json' --data-binary '{ "q": "peter parker", "matchingStrategy": "all" }'
此功能自 2021 年 9 月以来一直在开发中,当时我们的产品经理 Guillaume Mourier 发起了 “查询词匹配策略” 讨论,以收集有关此事的反馈。我们要感谢所有参与者抽出时间分享他们的意见 🙏 没有我们社区的支持,Meilisearch 就不会像今天这样存在 🥰
使用这两种策略的原因与用例一样多。还不确定选择哪一个?我创建了一个演示,您可以测试这两种策略,以帮助您下定决心 😊
有关匹配策略自定义的更多深入信息,您可以阅读文档的 专用部分。
演示
此演示使用了 movies 数据集,该数据集在 Meilisearch 的 快速入门指南 和整个 文档 中广泛使用。
我对设置没有任何更改。我只是索引了数据集并保留了默认配置。像新下的雪一样纯净 ❄️
执行搜索时,您可以单击按钮修改 matchingStrategy
搜索参数,并查看根据所用策略的不同结果。
在此处尝试 👉 matching-strategy.meilisearch.com
如果您缺乏想法或需要一些查询词的灵感,我列出了一些查询想法,范围从 2 个词到 10 个词的查询:
- forrest gump
- big fat liar
- return to never land
- the purple rose of cairo
- the curious incident of the dog in the night time
结论
我希望这个演示能帮助您更好地理解两种策略之间的差异及其对搜索结果的影响。与往常一样,您可以在 GitHub 上找到代码。
有很多方法可以微调搜索结果的相关性。这只是众多可用选项之一。我们知道每个项目都是不同的,并且有自己的要求;这就是为什么您的反馈对我们如此重要。我们努力使自定义您的实例变得容易,以便您可以为您的用户提供最佳的搜索体验。
请随时查看我们的 产品仓库,并提出建议或加入有关改进产品的现有讨论。
如果您喜欢 Meilisearch 并想支持我们,在 GitHub 上点亮一颗星对我们意义重大 😇