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

Meilisearch v0.29 已发布,并带来了一项新功能:匹配策略自定义!
考虑以下情况:用户发送一个包含两个词的搜索请求。当没有足够的文档来满足请求的 limit
时会发生什么?搜索引擎应该只返回包含所有查询词的文档吗?或者它应该返回更多文档?如果是,它应该应用哪些标准来返回这些文档?
这就是匹配策略发挥作用的地方。当搜索引擎没有找到足够多的包含所有查询词的文档时,匹配策略用于匹配查询词。这是一个不容易做出的决定,并且高度取决于用户正在搜索的数据类型。幸运的是,现在您可以在搜索时选择要应用的策略 🎉
一点历史
早在2021年,v0.21 之前的所有版本只返回包含所有查询词的文档。因此,如果我搜索“Peter Parker”,它将只返回同时包含“peter”和“parker”这两个词的文档。这种匹配策略被称为:all
,因为文档必须包含所有查询词才能被返回。
排序规则是 Meilisearch 确保相关结果最重要的功能之一。词语排序规则规定如下:
结果按匹配查询词数量递减排序。首先返回包含所有查询词的文档。
这项规则在我们的文档中存在了一段时间,并伴随着以下警告信息:
目前,返回的文档中必须包含所有查询词。因此,此规则尚未影响搜索结果。
随着 v0.21 的发布,词语规则开始生效,因此这个关于所有查询词必须存在的限制的警告也随之消失了。
从那时起,如果没有足够的文档包含所有查询词,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 就不会像今天这样存在 🥰
使用任何一种策略的理由都与使用场景一样多。还不确定选择哪一个?我创建了一个演示,您可以测试两种策略,以帮助您做出决定 😊
有关匹配策略自定义的更多深入信息,您可以阅读文档的 专用部分。
演示
此演示使用 电影数据集,该数据集在 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 上点赞对我们意义重大 😇