v0.30 版本的新功能
此版本为您带来索引交换功能,实现零停机部署;编号分页功能,方便您浏览搜索结果;并新增任务管理功能。

在本文中,让我们来看看 Meilisearch 最新更新中的一些最重大变化。您可以阅读 GitHub 上的完整更新日志,但我们将在本文中介绍主要的更新。
零停机索引部署
将数据库更改与 Meilisearch 索引同步会导致停机。您无法承受“损坏”的搜索:用户体验至关重要。您已经想出了一些变通方法,但这需要时间和资源。一定有更简单的方法来处理这个问题,对吧?
v0.30 引入了索引交换。您现在可以零停机部署新的索引版本!
为了同步主数据库和 Meilisearch 索引 —indexA
— 之间的更改,您只需执行以下步骤
- 步骤 1:创建索引的新版本 —
indexA_new
— 包含所有这些更改 - 步骤 2:交换索引,这意味着您将
indexA
的文档、设置和任务历史记录替换为indexA_new
的文档、设置和任务历史记录。这是您需要发送的请求,以实现神奇的效果
curl -X POST 'http://localhost:7700/swap-indexes' -H 'Content-Type: application/json' --data-binary '[ { "indexes": ["indexA", "indexA_new"] } ]'
⏲️ 等待任务状态更新为 succeeded
...
🎉 哒哒!您的更改现在已在生产环境中生效!您的用户仍然在 indexA
中搜索,但它现在包含 indexA_new
的数据,而 indexA_new
现在包含 indexA
的数据。
新功能:任务取消和删除
v0.30 让您可以更好地控制异步操作:您现在可以取消任务并删除您的任务历史记录。
任务取消
无法取消任务一直是用户长期以来提出的常见问题之一。无法中断错误排队或处理时间过长的任务可能会非常令人沮丧。
在 v0.30 中,这个问题已成为过去。使用新的 API 路由 /tasks/cancel
,您可以根据以下条件取消排队或正在处理的任务
uid
状态
类型
indexUid
- 它们排队或开始的日期(
beforeEnqueuedAt
、afterEnqueuedAt
、beforeStartedAt
、afterStartedAt
)
您可以在我们的文档中了解更多关于任务的信息。
要取消所有将文档添加到索引或更新索引的排队任务,您应该发送以下请求
curl -X POST 'http://localhost:7700/tasks/cancel?statuses=enqueued&types=documentAdditionOrUpdate’
任务删除
成功或失败的任务信息,以及现在已取消的任务信息,可能会占用实例中大量异步操作所需的大量磁盘空间。使用新的 DELETE /tasks
端点清理已完成的任务。
与任务取消一样,任务删除可以基于任务的以下条件进行
uid
状态
类型
indexUid
- 它们排队或开始的日期(
beforeEnqueuedAt
、afterEnqueuedAt
、beforeStartedAt
、afterStartedAt
)
但您也可以根据任务完成处理的日期和取消任务的任务来删除它们
beforeFinishedAt
afterFinishedAt
canceledBy
以下请求删除 2020 年 10 月 11 日上午 11:49:53 之前处理的所有任务。
curl -X DELETE 'http://localhost:7700/tasks?beforeFinishedAt=2020-10-11T11:49:53.000Z'
新功能:配置文件支持
感谢我们亲爱的贡献者 mlemesle,一种配置 Meilisearch 实例的新方法已经出现。除了环境变量和 CLI 选项之外,您还可以使用配置文件 🥳
配置文件可以轻松共享和版本化。它们允许您在一个地方管理所有配置选项,并一目了然地查看整体情况。
为此,请在单个 .toml
文件中设置所需的实例选项
env = "production" master_key = "YOUR_MASTER_KEY_VALUE"
您可以使用 --config-file-path
CLI 选项或 MEILI_CONFIG_FILE_PATH
环境变量来指定配置文件。否则,Meilisearch 将使用工作目录中的文件 ./config.toml
作为默认配置文件。您可以使用以下命令下载默认配置文件
curl https://raw.githubusercontent.com/meilisearch/meilisearch/main/config.toml > config.toml
请注意,在配置文件中指定 config-file-path
键将抛出错误。
如果未提供配置文件,则 Config file path
将设置为 none
。
改进:搜索结果分页
v0.30 为需要分页界面的用户引入了编号分页模式。
在 v0.29 之前的版本中,当使用搜索端点时,Meilisearch 仅返回 estimatedTotalHits
,即与查询匹配的文档数量的估计值。因此,不建议创建带有页面选择器的界面。
您现在可以使用新的搜索参数 page
或 hitsPerPage
来获取查询的详尽命中数和总页数。
curl -X POST 'http://localhost:7700/indexes/movies/search' -H 'Content-Type: application/json' --data-binary '{ "q": "american ninja", "page": 1 }'
上述请求将获取给定查询的第一页结果,并将返回以下响应
{ "hits": [ // … 20 hits ], "query": "american ninja", "processingTimeMs": 2, "hitsPerPage": 20, "page": 1, "totalPages": 49, "totalHits": 966 }
如您所见,它返回了详尽的搜索结果数 (totalHits
) 和搜索结果页数 (totalPages
),这使您可以轻松创建编号分页界面。
👉 请注意,totalHits
和 totalPages
是基于 pagination.maxTotalHits 索引设置计算的。
重大变更
字段重命名
当批量删除文档时,相应的任务对象包含一个字段,其中包含接收到的文档 ID 的数量。此字段以前称为 receivedDocumentIds
,现已重命名为 providedIds
。
新错误
在用户尝试访问 /keys
路由但未设置主密钥的情况下,Meilisearch 现在会抛出更有帮助的错误 missing_master_key
{ "message": "Meilisearch is running without a master key. To access this API endpoint, you must have set a master key at launch.", "code": "missing_master_key", "type": "auth", "link": "https://docs.meilisearch.com/errors#missing_master_key" }
任务过滤器和错误命名
为了保持与它们可以具有的值命名一致,我们将用于过滤任务的查询参数复数化
indexUid
变为indexUids
type
变为types
status
变为statuses
我们还重命名了以下错误代码
invalid_task_type
为invalid_task_types_filter
invalid_task_status
为invalid_task_statuses_filter
Hacktoberfest 贡献
我们非常感谢在 Hacktoberfest 期间收到的所有贡献。上面提到的大部分更改都来自这些贡献,我们想重点介绍另外两项。如果没有我们的贡献者,我们不会在此版本中发布它们。
- 感谢 @mou 对压缩 API 请求(Gzip、Brotli、Zlib)的支持
- 感谢 @jeertmans 提供的 Apple Silicon 二进制文件
其他更改
- Meilisearch 默认绑定到
127.0.0.1:7700
,这是一个 IPv4 地址。为了使 Meilisearch 可以通过 IPv4 (127.0.0.1:7700
) 和 IPv6 ([::1]:7700
) 地址访问,我们将默认地址更改为localhost:7700
。 - 所有任务对象现在都包含
canceledBy
和error
字段 - 新的 任务过滤器 可用于
GET /tasks
端点uids
beforeEnqueuedAt
/afterEnqueuedAt
beforeStartedAt
/afterStartedAt
beforeFinishedAt
/afterFinishedAt
canceledBy
- 我们引入了一种新的任务类型:
snapshotCreation
。快照任务现在在任务列表中可见 - 索引速度已显着提高
- 我们减少了 Meilisearch 二进制文件的大小以及 Meilisearch 实例在磁盘空间中占用的空间
- 所有实例选项现在都有其对应的环境变量。一些与快照和转储功能相关的环境变量之前缺失了
非常感谢我们所有的贡献者!没有你们的帮助,这个项目不会取得很大的进展 🙏
v0.30 版本就是这些!请务必查看更新日志以获取完整的发行说明。