掌握 Meilisearch 的拼写容错功能
没人喜欢“未找到结果”页面。了解如何避免在您的应用上返回过少或过多的搜索结果。

各位,各位!Meilisearch 新版本发布啦,它为您带来了一系列很酷的新功能,包括一个长期以来备受期待的功能:拼写容错自定义!
一段时间以来,我们一直收到用户的反馈,希望禁用或微调拼写容错功能。Meilisearch v0.21 引入了短语搜索,如果查询词用双引号括起来,例如:“african-american poet”
,则返回包含精确查询词的文档。
这是朝着满足用户需求迈出的一大步,但这还不够。在仔细研究这个问题之后,时机已经成熟:拼写容错的自定义已成为现实🎉
等一下,自定义拼写容错到底是什么意思?更重要的是,拼写容错是什么意思?
良好的旧默认行为
Meilisearch 具有拼写容错功能,这意味着即使您的搜索中有拼写错误,它也能理解您的搜索。但是,能力越大,责任越大,这意味着需要设置界限以保持结果的相关性。这转化为以下三个规则
- 如果查询词少于 5 个字符,则不允许拼写错误
- 如果查询词在 5 到 8 个字符之间,则只允许 1 个拼写错误
- 如果查询词超过 8 个字符,则允许 2 个拼写错误
因此,如果您要查找 lost
但不小心输入了 last
,您将不会得到想要的结果,因为它只有 4 个字符长。
但是,输入 greeec
而不是 greece
会检索到预期的文档,因为它有 6 个字符长,因此允许一个拼写错误。
这些规则默认应用,并且是 Meilisearch 开箱即用配置的一部分,可提供强大且相关的搜索。然而,正如他们所说,规则是用来打破的...
自定义:可能性的新视野
我们知道每个项目都不同,有些用户需要配置拼写容错以适应其项目的特殊性。我们听到了您的声音!
让我们看看新的拼写容错设置
"typoTolerance": { "enabled": true, "minWordSizeForTypos": { "oneTypo": 5, "twoTypos": 10 }, "disableOnWords": [], "disableOnAttributes": [] }
查看上面的 typoTolerance
对象,您现在可以
- 通过设置
"enabled": false
完全禁用拼写容错 😱 - 使用
"disableOnWords"
在一组特定术语上部分禁用拼写容错 - 在所需的文档属性
"disableOnAttributes"
上禁用拼写容错
您还可以通过修改接受一个或两个拼写错误的单词的最小大小来微调拼写容错设置。
总之,您可以完全控制此功能。
有关拼写容错自定义的更深入信息,您可以阅读文档的专门章节。
尝试一下,看看效果
俗话说,一图胜千言(抱歉,我忍不住要用口头禅了);这就是为什么我创建了一个演示来展示不同的拼写容错配置如何影响返回的搜索结果。您可以在这里测试它。
我们将使用 Hakan Özler 的 书籍数据集。为了演示目的,我对原始数据集进行了一些更改,您可以在 GitHub 上找到转换后的数据集。您可以通过书名、ISBN(书籍的 ID)、作者或描述中的词语来搜索书籍。
我创建了两个具有不同拼写容错设置的相同索引。一个索引使用开箱即用的拼写容错设置,而另一个索引使用以下设置
const customTypoTolerance = { disableOnAttributes: ['isbn'], minWordSizeForTypos: { oneTypo: 2, twoTypos: 4 } }
拼写容错在 isbn
上被禁用,并且允许在较短的单词上出现拼写错误:对于 2 个和 3 个字符长的单词允许一个拼写错误,对于任何更长的单词允许两个拼写错误。
通常,向最终用户提供一些结果比不提供任何结果要好。这就是为什么我将阈值设置为最低建议值。尝试输入 flx
,看看会发生什么!
但是,有时最好只返回完全匹配的结果。例如,当按文档的唯一标识符搜索文档时。ISBN 正是如此:书籍的 ID。因此,我禁用了 isbn
属性的拼写容错。
让我们尝试通过 ISBN 查找一本名为“Well-Grounded Rubyist”的书籍;在搜索栏中输入 1933988657
。
如您所见,使用这两种设置我们都能得到想要的书籍。但是,当启用拼写容错时,我们会得到多个结果。搜索无效的 ISBN(如 1933988676
)在启用拼写容错时仍然会返回结果;这可能会让人感到困惑和误导。
结论
我没有禁用任何单词的拼写容错,因为鉴于此数据集,我认为没有必要,您认为呢?如果您想进行一些修改并尝试获得更相关的结果,请随意:您可以在GitHub 上找到代码。
但是,如果您喜欢真正的挑战,我为您准备了一个。 Literal,一个面向图书阅读者的在线平台,使用 Meilisearch 搜索书架。他们非常友善地分享了他们一直在使用的配方,以提供相关的搜索结果
{ "displayedAttributes":[ "id", "title", "workId", "authors", "categories", "popularity" ], "searchableAttributes":[ "authors", "title", "categories" ], "filterableAttributes":[ "isbn10", "isbn13", "language" ], "distinctAttribute":"workId", "rankingRules":[ "words", "typo", "popularity:desc", "proximity", "attribute", "sort", "exactness" ] }
您能提出更好的配置吗?您能想到完善的拼写容错设置来提高相关性吗?
正如您可能已经注意到的,我们非常重视用户反馈。请随时查看我们的公开路线图,并为您希望在未来版本中看到的功能投票,或提交新的功能想法。您还可以查看我们的产品仓库,提出建议或加入有关改进产品的现有讨论。
如果您喜欢 Meilisearch 并想支持我们,在 GitHub 上点亮一颗星对我们意义重大 🥰