v0.28 有哪些新功能
本月发布带来了两个很棒的新功能:智能裁剪和确定性 API 密钥。它还通过稳定我们的 API,让我们离 v1.0 更近了一步!

在本文中,让我们来看看 Meilisearch 最新更新中的一些最重要变化。此版本为您带来了智能裁剪和确定性 API 密钥等新功能。通过 v0.28,我们已经稳定了 API,迈出了迈向 v1.0 的第一步 🎉 这种稳定带来了多项变化。您可以在 GitHub 上阅读完整的更新日志,但我们将在本文中介绍主要内容。
新功能:智能裁剪
Meilisearch 不再将第一个搜索词匹配视为最佳裁剪位置,而是将裁剪围绕最大数量的唯一匹配项居中,优先考虑彼此更接近并遵循原始查询顺序的词语。 Meilisearch 在裁剪时还会考虑上下文,并优先保持句子完整。
给定以下字符串
“A young elephant, whose oversized ears enable him to fly, helps save a struggling circus, but when the circus plans a new venture, Dumbo and his friends discover dark secrets beneath its shiny veneer.”
如果搜索查询是 Dumbo
并且 cropLength
是 5
,Meilisearch 现在将返回
"… Dumbo and his friends discover…”
而不是
"…new venture, Dumbo and his…”
新功能:确定性 API 密钥
确定性算法是一种给定特定输入后,总能产生相同输出,不涉及任何随机性的算法。
您可以通过在创建时指定一个 uid
字段来创建一个确定性 key
值。uid
值必须遵循 uuid v4 格式。如果您不指定任何内容,Meilisearch 会自动为您生成 uid
。
key
字段的值是通过将主密钥与 uid
进行哈希处理生成的。相同的组合总是会产生相同的 key
值。
这将允许您在不同的 Meilisearch 实例中拥有相同的 API 密钥集。因此,在升级或重新部署 Meilisearch 实例时,您将能够保留您的 API 密钥。
由于这些修改,从旧版本 Meilisearch 导入的密钥将重新生成其 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
时,表示没有更多任务可供查看。
这种分页系统称为 keyset 分页。与用于浏览索引、文档和密钥的偏移分页不同,它有两个主要优点:它能防止任何不一致性,并且由于无需扫描和计数记录,效率更高,当您的任务队列快速增长时,这是一个显著的优势。
过滤任务
我们还将任务列表设为可过滤。您现在可以按 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 的更新内容就这些了!请记住查看更新日志以获取完整的发布说明,下次再见!