
本文介绍了 Meilisearch 最新版本的一些主要变化。更多详细信息,请阅读 GitHub 上的完整更新日志。
新功能:匹配策略
v0.29 引入了一个新的搜索参数:matchingStrategy
。此参数允许您在搜索时定义 Meilisearch 如何匹配查询词语。
last
:首先返回包含所有查询词语的文档。然后通过减少匹配中存在的查询词语数量来检索其他结果:Meilisearch 将一次删除一个查询词语,从查询的末尾开始,并将任何新的匹配项添加到结果列表中。这是 v0.21 以来的行为,并将保持为默认策略。all
:仅返回包含所有查询词语的文档。
示例
curl \ -X POST '<https://:7700/indexes/movies/search>' \ -H 'Content-Type: application/json' \ --data-binary '{ "q": "american ninja", "matchingStrategy": "all" }'
通过上述请求,Meilisearch 将只返回同时包含“美国”和“忍者”的文档。
我们希望这个新功能能够鼓励那些仍在使用 v0.20(Meilisearch 默认使用 all
匹配策略的最后一个官方版本)的用户更新到我们最新的版本,并受益于此后引入的新功能:排序、地理搜索、精细 API 密钥权限等等!如果您仍在使用 v0.20,并且暂时不打算升级,我们很乐意了解是什么阻碍了您。
您可以通过匹配策略演示测试此功能,并在专门的博客文章中了解更多关于它的信息。改进:索引性能
我们已经加快了索引速度,特别是以下操作
- 分面索引:我们修改了算法,以提高可筛选属性的索引速度。
- 文档删除和更新
- 我们引入了**软删除**。这是一种技术,通过使用标记将数据标记为已删除,使其对所有用户不可访问,而无需实际从数据库中删除。文档稍后在占用设备空间过多之前被删除。因此,在磁盘上删除记录所需的时间被推迟,并且不会延迟索引过程。
- 在重新索引时,Meilisearch 现在会检测是否存在完全相同版本的文档,如果存在,则不再对其进行索引。
行为变更:自动批处理
在 v0.26 中,我们引入了一个实验性功能:自动批处理。当激活时,自动批处理会自动合并连续的文档添加请求,显著加快索引过程。
我们很高兴地宣布,自动批处理现在是默认的索引行为,不再是实验性功能 🥳
这意味着您不再需要使用 **--enable-auto-batching**
CLI 标志来启用它。现在使用 --enable-auto-batching
将抛出以下错误:
error: Found argument '--enable-auto-batching' which wasn't expected, or isn't valid in this context Did you mean '--disable-auto-batching'? If you tried to supply `--enable-auto-batching` as a value rather than a flag, use `-- --enable-auto-batching` USAGE: meilisearch --disable-auto-batching
以下自动批处理自定义选项也已移除,如果使用将抛出错误,因此在升级到 v0.29 之前,请确保您的应用程序未使用其中任何一个。
--debounce-duration-sec
--max-batch-size
--max-documents-per-batch
如果您还没有激活自动批处理功能,那么您无需做任何事情,只需享受提升的索引速度 🏎️
🧐 您可能已经在上面的错误消息中注意到:如果出于某种原因您不希望 Meilisearch 自动批处理请求,可以使用一个新的 CLI 标志来停用此功能:--disable-auto-batching
。
我们正在不断努力改进我们的搜索引擎,您的反馈至关重要。如果您在文档索引速度方面遇到任何问题,如果您能在此讨论中告知我们,我们将不胜感激。
改进:筛选器
我们增加了两个新的筛选器操作符:IN
和 EXISTS
IN
运算符选择指定字段包含至少一个给定值的所有文档。EXISTS
运算符检查字段是否存在。请注意,空值或 null 值的字段仍被视为存在。
给定以下书籍数据集
[ { "id": 1, "title": "Pride and Prejudice", "genres": ["romance"] }, { "id": 2, "title": "Le Petit Prince", "genres": [] }, { "id": 3, "title": "Alice In Wonderland" }, { "id": 4, "title": "The Hobbit", "genres": ["adventure", "fantasy"] }, { "id": 5, "title": "A Game of Thrones", "genres": ["fantasy"] }, ]
表达式 genres IN [fantasy, adventure]
将返回文档 4
和 5
。
表达式 genres EXISTS
将返回文档 1
、2
、4
和 5
。
这两个运算符都可以与 NOT
(!=
) 运算符结合使用。
行为变更:**!=
(NOT
) 筛选操作符**
!=
(NOT
) 筛选操作符返回不满足条件的文档。
考虑到以下文档
{ "id": 1, "product": "T-shirt", "price": 20 } { "id": 2, "product": "T-shirt" } { "id": 3, "product": "T-shirt", "price": 30 }
NOT price = 20
应该返回所有价格属性不等于 20 的文档。
在 v0.29 中,!=
(NOT
) 筛选器匹配缺少指定属性的文档。在上述示例中,这意味着 Meilisearch 返回文档 2
和 3
。
在 v0.29 之前,Meilisearch 不会包含缺少 price
属性的结果。在上述示例中,v0.28 只会返回文档 3
。
您可以通过将 !=
(NOT
) 运算符与新的 EXISTS
运算符结合使用,确保筛选器只返回包含指定属性的文档:price EXISTS AND price != 20
将只返回文档 3
。
改进:密钥管理
在管理密钥时,在 actions
数组中使用 *
通配符可以访问所有端点。
{ "name": "Default Admin API Key", "description": "Use it for anything that is not a search operation. Caution! Do not expose it on a public frontend", "key": "380689dd379232519a54d15935750cc7625620a2ea2fc06907cb40ba5b421b6f", "uid": "20f7e4c4-612c-4dd1-b783-7934cc038213", "actions": ["*"], "indexes": ["*"], "expiresAt": null, "createdAt": "2021-08-11T10:00:00Z", "updatedAt": "2021-08-11T10:00:00Z" }
现在,多亏了我们的贡献者,它也可以用作通配符,表示单个特定路由的所有端点 🙌
您无需列出每个单独的端点,只需将 *
字符附加到所需路由即可。例如,documents.*
授权访问所有与文档相关的端点。
改进:泰语支持
我们尊敬的贡献者 @aFluffyHotdog 引入了对泰语的优化支持 🥳
我们一直在寻找方法,让 Meilisearch 的语言支持变得更好。我们从母语使用者那里获得的反馈越多,我们就越容易理解如何提高这些语言的性能和搜索相关性。
想帮助我们支持您的语言吗?贡献!如果您需要指导或帮助,请不要犹豫联系我们;我们期待与您合作!
贡献者
没有我们社区的支持,Meilisearch 不会像今天这样存在。你们真的很棒,我们对你们为 Meilisearch 付出的所有努力、建议、评论和时间感激不尽。本月,我们要特别感谢 @evpeople、@Mcdostone、@pavo-tusker、@phdavis1027、@ryanrussell 和 @VasiliySoldatkin 对 Meilisearch 的帮助;@GraDKh 对 Milli 的帮助;以及 @aFluffyHotdog、@matthias-wright 和 @mosuka 对我们的分词器 Charabia 的帮助。
就这些了,各位!记得查看更新日志以获取完整的发布说明,下次再见!