在本文中,让我们看一下 Meilisearch 最新更新中的一些最重要的更改。此版本为您带来了新功能,例如智能裁剪和确定性 API 密钥。借助 v0.28,我们已经稳定了我们的 API,迈向了 v1.0 🎉 的第一步。此稳定性带来了多项更改。您可以阅读 GitHub 上的完整变更日志,但我们将在本文中介绍主要内容。

新功能:智能裁剪

Meilisearch 不会将第一个搜索词匹配视为最佳裁剪位置,而是将裁剪集中在最大数量的唯一匹配项周围,优先考虑彼此更靠近且遵循原始查询顺序的词语。 Meilisearch 在裁剪时还会考虑上下文,并优先保留句子完整性。

给定以下字符串

👉
“一只年轻的大象,它巨大的耳朵使它能够飞行,帮助拯救了陷入困境的马戏团,但当马戏团计划一项新的冒险时,小飞象和他的朋友们发现了其闪亮外表下掩盖的黑暗秘密。”‌

如果搜索查询是 Dumbo 并且 cropLength5,Meilisearch 现在将返回

"… 小飞象和他的朋友们发现了…”

而不是

"… 新的冒险,小飞象和他的…”

新功能:确定性 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 时,表示没有更多任务可以查看。

这种类型的分页系统称为键集分页。与用于浏览索引、文档和密钥的偏移量分页不同,它有两个主要优点:它可以防止任何不一致,并且由于无需扫描和计数记录,因此效率更高,这在您的任务队列快速增长时是一个显着优势。

筛选任务

我们还使 任务列表可筛选。您现在可以按 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 中 - 它们可以跳过队列。

via 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 就到这里了!请记住查看 变更日志 以获取完整的发布说明,我们下次再见!

‌‌