掌控 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 上点亮一颗星对我们意义重大 🥰