
在本文中,我们将探讨 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 密钥。
由于这些修改,从旧版 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 '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
:返回的第一个任务的uid
next
:下一个任务的uid
要查看下一页结果,您需要重复相同的查询,将 from
的值替换为 next
的值。当 next
的值为 null
时,表示没有更多任务可供查看。
这种分页系统称为“keyset 分页”。与用于浏览索引、文档和密钥的偏移分页不同,它有两个主要优点:它可以防止任何不一致性,并且由于无需扫描和计数记录,效率更高,这在任务队列快速增长时是一个显著优势。
筛选任务
我们还使任务列表可筛选。您现在可以按 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 的贡献体验。分词器的作用是将句子或短语拆分成更小的语言单元,称为 token。它是搜索结果质量的关键因素。现在,向 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 的内容就是这些了!请记住查看 更新日志 以获取完整的发布说明,下次再见!