在本文中,让我们看一下 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 'http://localhost: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
:返回的第一个任务的uid
next
:下一个任务的uid
要查看下一页结果,您需要重复相同的查询,将 from
的值替换为 next
的值。当 next
的值为 null
时,表示没有更多任务可以查看。
这种类型的分页系统称为键集分页。与用于浏览索引、文档和密钥的偏移量分页不同,它有两个主要优点:它可以防止任何不一致,并且由于无需扫描和计数记录,因此效率更高,这在您的任务队列快速增长时是一个显着优势。
筛选任务
我们还使 任务列表可筛选。您现在可以按 status
、type
或 indexUid
获取任务。
例如,以下命令将返回属于成功完成的索引电影的所有任务
curl -X GET 'http://localhost: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 就到这里了!请记住查看 变更日志 以获取完整的发布说明,我们下次再见!