在本文中,让我们看一下 Meilisearch 最新更新中的一些最重要的更改。此版本为您带来了新功能,例如智能裁剪和确定性 API 密钥。借助 v0.28,我们已经稳定了我们的 API,迈向了 v1.0 🎉 的第一步。此稳定性带来了多项更改。您可以阅读 GitHub 上的完整变更日志,但我们将在本文中介绍主要内容。
新功能:智能裁剪
Meilisearch 不会将第一个搜索词匹配视为最佳裁剪位置,而是将裁剪集中在最大数量的唯一匹配项周围,优先考虑彼此更靠近且遵循原始查询顺序的词语。 Meilisearch 在裁剪时还会考虑上下文,并优先保留句子完整性。
给定以下字符串
如果搜索查询是 Dumbo 并且 cropLength 是 5,Meilisearch 现在将返回
"… 小飞象和他的朋友们发现了…”
而不是
"… 新的冒险,小飞象和他的…”
新功能:确定性 API 密钥
**确定性算法**是一种算法,在给定特定输入时,总是产生相同的输出,不涉及任何随机性。
您可以在创建时指定 uid 字段来创建确定性的 key 值。uid 值必须遵循 uuid v4 格式。如果您不指定任何内容,Meilisearch 会自动为您生成 uid。
key 字段的值是通过对主密钥和 uid 进行哈希运算生成的。相同的组合始终导致相同的 key 值。
这将使您能够在不同的 Meilisearch 实例中拥有相同的 API 密钥集。因此,在升级或重新部署 Meilisearch 实例时,您将能够保留 API 密钥。
key 和 uid 字段。更新 Meilisearch 实例时,**您需要更新密钥**。我们还添加了一个 name 字段,使 API 密钥检索更加方便。现在,密钥对象应如下所示
{
"name": null,
"description": "Manage documents: Products/Reviews API key",
"key": "d0552b41536279a0ad88bd595327b96f01176a60c2243e906c52ac02375f9bc4",
"uid": "6062abda-a5aa-4414-ac91-ecd7944c0f8d",
"actions": [
"documents.add",
"documents.delete"
],
"indexes": [
"products",
"reviews"
],
"expiresAt": "2021-12-31T23:59:59Z",
"createdAt": "2021-10-12T00:00:00Z",
"updatedAt": "2021-10-13T15:00:00Z"
}有关 API 密钥管理的其他更改包括
- 能够通过
key或uid字段检索、更新和删除密钥 - 引入新的操作来管理 API 密钥 (
keys.get、keys.create、keys.update、keys.delete) - 出于安全原因,删除了在创建后更新 API 密钥的
actions、indexes或expiresAt属性的可能性
重大变更:搜索术语
我们正在走向 v1,这意味着要定义一个稳定的 API。为了提高清晰度,我们对 /indexes/{uid}/search 终结点中一些搜索参数和响应字段的命名进行了更改。
以前称为 facetsDistribution 和 matches 的搜索参数现在分别称为 facets 和 showMatchesPosition。
使用这些参数时返回的响应字段现在是 facetDistribution 而不是 facetsDistribution - 注意s 的省略 - 以及 _matchesPosition 而不是 _matchesInfo。
响应字段 nbHits 已重命名为 estimatedTotalHits。此值经常用于计算搜索结果页面的数量,我们强烈建议不要这样做。要了解如何在不使用 nbHits 的情况下使用 Meilisearch 进行分页,请查看此 全新的指南。
对于以下查询
curl \
-X POST 'https://:7700/indexes/movies/search' \
-H 'Content-Type: application/json' \
--data-binary '{
"q": "Shazam",
"facets: ["genres"],
"showMatchesPosition": true
}'您将获得以下响应
{
"hits": [
{
"id": "287947",
"title": "Shazam!",
"poster": "https://image.tmdb.org/t/p/w500/xnopI5Xtky18MPhK40cZAGAOVeV.jpg",
"overview": "A boy is given the ability to become an adult superhero in times of need with a single magic word.",
"release_date": 1553299200,
"genres": [
"Action",
"Comedy",
"Fantasy"
],
"_matchesPosition": {
"title": [
{
"start": 0,
"length": 6
}
]
}
},
...
],
"estimatedTotalHits": 3,
"query": "Shazam",
"limit": 20,
"offset": 0,
"processingTimeMs": 4,
"facetDistribution": {
"genres": {
"Action": 3,
"Animation": 2,
"Comedy": 1,
"Fantasy": 1
}
}
}
重大变更:任务管理
浏览任务
我们在 /tasks 终结点添加了一个新的分页系统。
通过此更改,浏览任务变得容易得多,因为任务的数量在异步操作数量较大的实例中可能会迅速增加。
对于对该终结点的每次调用,响应将返回以下字段
limit:返回的任务数量(默认为 20)from:返回的第一个任务的uidnext:下一个任务的uid
要查看下一页结果,您需要重复相同的查询,将 from 的值替换为 next 的值。当 next 的值为 null 时,表示没有更多任务可以查看。
这种类型的分页系统称为键集分页。与用于浏览索引、文档和密钥的偏移量分页不同,它有两个主要优点:它可以防止任何不一致,并且由于无需扫描和计数记录,因此效率更高,这在您的任务队列快速增长时是一个显着优势。
筛选任务
我们还使 任务列表可筛选。您现在可以按 status、type 或 indexUid 获取任务。
例如,以下命令将返回属于成功完成的索引电影的所有任务
curl -X GET 'https://:7700/tasks?indexUid=movies&status=succeeded'这些修改导致删除了 GET /indexes/:indexUid/tasks 和 GET /indexes/:indexUid/tasks/:taskUid 终结点。
重大变更:转储
转储创建始终是一个异步操作,但使用的是与任务队列分开的队列。借助 v0.28,转储已成为任务。这导致了一种名为 dumpCreation 的新任务类型。
尽管是任务,因此共享相同的队列,但转储具有优先级。它们将在当前任务运行完成后立即处理。您可以将转储视为俱乐部中的 VIP;即使它们最后到达 - 这反映在它们的 taskUid 中 - 它们可以跳过队列。
贡献者体验
我们一直在努力改善我们分词器的贡献体验:charabia。分词器的作用是将句子或短语分成更小的语言单位,称为词语。它是搜索结果质量的关键因素。现在,将语言添加到 Meilisearch 中变得容易得多。您只需按照 CONTRIBUTING.md 上的说明进行操作即可。
Meilisearch 与任何用空格分隔的语言完美配合,并对日语和中文提供特殊支持。我们现在还支持希伯来语,这要归功于我们出色的社区!其他语言仍然可以使用,但搜索结果的质量和相关性可能会显著不同。
我们希望提供全球语言支持。我们从母语人士那里获得的反馈越多,我们越容易了解如何改进这些语言的性能。如果您想帮助我们 支持您的语言,我们渴望收到您的来信,并看看我们如何共同取得进展!
其他更改
- 我们在
GET /indexes和GET /keys终结点的响应中添加了分页,并改进了GET /indexes/{uid}/documents的分页功能 - 出于性能原因,我们决定限制每个分面属性返回的分面值数量。此限制是可自定义的,默认值为 100
- 您可以自定义 Meilisearch 在搜索中返回的文档数量。默认限制为 1000,可防止恶意抓取数据库。请注意,增加此限制可能会影响性能
对于所有这些更改带来的任何不便,我们提前表示歉意。这是为了一个好目标:我们现在正在进行这些更改,以便向 v1.0 过渡,并避免以后出现重大变更。如果您需要支持或有任何疑问,请随时与我们联系。我们很乐意提供帮助!
贡献者
我们非常感谢这个很棒的社区。我们要感谢 @0x0x1、@choznerol、@pierre-l、@ryanrussell、@Thearas 和 @walterbm 对 Meilisearch 的帮助,以及 @matthias-wright 对 milli 的帮助。我们要特别感谢 @benny-n 将希伯来语添加到我们的 分词器 中。
v0.28 就到这里了!请记住查看 变更日志 以获取完整的发布说明,我们下次再见!