前往首页Meilisearch 的标志
返回文章
2022 年 7 月 11 日

v0.28 有哪些新功能

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

Carolina Ferreira
Carolina FerreiraMeilisearch 开发者布道师@CarolainFG
What's new in v0.28

在本文中,让我们来看看 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 并且 cropLength5,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 导入的密钥将重新生成其 keyuid 字段。更新 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 密钥管理的其他更改包括

  • 能够通过 keyuid 字段检索、更新和删除密钥
  • 引入新的操作来管理 API 密钥(keys.getkeys.createkeys.updatekeys.delete
  • 出于安全原因,取消了在创建后更新 API 密钥的 actionsindexesexpiresAt 属性的可能性

破坏性更改:搜索命名

我们正迈向 v1 版本,这意味着要定义一个稳定的 API。为了提高清晰度,我们对 /indexes/{uid}/search 端点中一些搜索参数和响应字段的命名进行了更改。

以前称为 facetsDistributionmatches 的搜索参数现在分别称为 facetsshowMatchesPosition

使用这些参数时返回的响应字段现在是 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 分页。与用于浏览索引、文档和密钥的偏移分页不同,它有两个主要优点:它能防止任何不一致性,并且由于无需扫描和计数记录,效率更高,当您的任务队列快速增长时,这是一个显著的优势。

过滤任务

我们还将任务列表设为可过滤。您现在可以按 statustypeindexUid 获取任务。

例如,以下命令返回属于电影索引且已成功的所有任务

curl -X GET 'http://localhost:7700/tasks?indexUid=movies&status=succeeded'

‌这些修改导致 GET /indexes/:indexUid/tasksGET /indexes/:indexUid/tasks/:taskUid 端点被删除。

破坏性更改:数据转储

数据转储创建一直是一个异步操作,但它使用独立于任务队列的单独队列。在 v0.28 中,数据转储已成为任务。这导致了一种名为 dumpCreation 的新任务类型。

尽管数据转储现在是任务并共享同一个队列,但它们被赋予了优先级。它们将在当前任务运行完成后立即处理。您可以将数据转储视为俱乐部中的 VIP;即使它们最后到达——这体现在它们的 taskUid 中——它们也可以插队。

来自 GIPHY

贡献者体验

我们一直致力于改进分词器 charabia 的贡献体验。分词器的作用是将句子或短语分割成更小的语言单位,称为词元。它是搜索结果质量的关键因素。现在,向 Meilisearch 添加语言变得容易得多。您只需按照 CONTRIBUTING.md 上的说明进行操作即可。

Meilisearch 与任何以空格分隔的语言都能完美配合,并特别支持日语和中文。感谢我们出色的社区,我们现在也支持希伯来语了! 其他语言仍然可以工作,但搜索结果的质量和相关性可能会有显著差异。

我们很乐意提供全球语言支持。我们从母语人士那里获得的反馈越多,就越容易理解如何提高这些语言的性能。如果您想帮助我们支持您的语言,我们非常期待您的来信,并希望看到我们如何共同进步!

其他更改

  • 我们已为 GET /indexesGET /keys 端点的响应添加了分页,并改进了 GET /indexes/{uid}/documents 的分页。
  • 出于性能原因,我们决定限制每个分面属性返回的分面值数量。此限制可自定义,默认为 100。
  • 您可以自定义 Meilisearch 在搜索时返回的文档数量。默认限制为 1000,可保护数据库免受恶意抓取。请注意,增加此限制可能会影响性能。

对于所有这些更改可能造成的不便,我们深表歉意。这是为了一个好的目标:我们现在进行这些更改是为了迈向 v1.0 并避免日后出现破坏性更改。如果您需要支持或有任何疑问,请随时与我们联系。我们总是乐于提供帮助!

贡献者

我们非常感谢这个了不起的社区。我们要感谢 @0x0x1@choznerol@pierre-l@ryanrussell@Thearas@walterbm 在 Meilisearch 方面提供的帮助,以及 @matthias-wrightmilli 方面提供的帮助。我们要特别感谢 @benny-n 为我们的分词器添加了希伯来语支持。

v0.28 的更新内容就这些了!请记住查看更新日志以获取完整的发布说明,下次再见!

‌‌

Meilisearch 1.14

Meilisearch 1.14

Meilisearch 1.14 引入了新的实验性功能,包括复合嵌入器和嵌入缓存以提升性能。它还增加了核心功能,例如粒度可过滤属性和按 ID 批量文档检索。

Carolina Ferreira
Carolina Ferreira2025 年 4 月 14 日
Meilisearch AI launch week recap

Meilisearch AI 发布周回顾

Meilisearch AI 发布回顾:通过 AI 和个性化改造搜索

Maya Shin
Maya Shin2025 年 3 月 28 日
Introducing Meilisearch's next-generation indexer: 4x faster updates, 30% less storage

推出 Meilisearch 下一代索引器:更新速度快 4 倍,存储空间减少 30%

2024 版索引器通过并行处理、优化的 RAM 使用和增强的可观察性彻底改变了搜索性能。查看我们最新版本中的新功能。

Louis Dureuil
Louis Dureuil2025 年 2 月 26 日