我们宣布发布 Meilisearch 1.6。让我们深入了解一些最重要的变化。您也可以查看 完整的更改日志 on GitHub。

🚀
Meilisearch 1.6 也在 Meilisearch 云 上可用,包括所有实验性功能。

Meilisearch 引入了混合搜索。它将全文搜索和语义搜索相结合,以提高搜索结果的准确性和全面性。想象一下像 where2watch 这样的电影应用程序。现在,您的用户将能够找到那些他们无法完全说出名字但记得故事的电影。

此外,Meilisearch 现在简化了向量嵌入的创建。选择您喜欢的嵌入器,Meilisearch 将为您处理与外部工具的所有交互。

配置嵌入器

您可以 在索引设置中配置嵌入器。从三种类型的嵌入器中选择适合您需求的嵌入器

openAI:

  • 使用 OpenAI API 计算嵌入
  • 需要 OpenAI API 密钥才能运行

huggingFace:

  • 通过从 HuggingFace Hub 下载模型来启用嵌入的本地计算
  • 在您的 CPU 上运行,而不是您的 GPU,这可能会影响索引性能

userProvided:

  • 与 Meilisearch v1.3 的功能类似,主要区别在于:您必须定义一个特定的嵌入器
  • 允许您将预先计算的嵌入添加到您的文档中。您可以使用向量而不是文本执行搜索。

要使用混合搜索,请在索引设置中定义至少一个嵌入器

{
  "embedders": {
    "default": {
      "source":  "openAi",
      "apiKey": "<your-OpenAI-API-key>",
      "model": "text-embedding-ada-002",
      "documentTemplate": "A movie titled '{{doc.title}}' whose description starts with {{doc.overview|truncatewords: 20}}"
    },
    "image": {
      "source": "userProvided",
      "dimensions": 512
    },
    "translation": {
      "source": "huggingFace",
      "model": "sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2",
      "documentTemplate": "A movie titled '{{doc.title}}' whose description starts with {{doc.overview|truncatewords: 20}}"
    }
  }
}

documentTemplate 字段充当创建文档嵌入的蓝图。它使用 Liquid 模板语言。虽然它的包含是可选的,但强烈推荐它,尤其是因为嵌入模型针对简洁文本进行了优化。它只保留必要的内容,排除诸如 id 之类的非必要数据,并有助于添加上下文以提高相关性。

执行混合搜索,请在 POST /index/:index_uid/search 路由中使用 hybrid 字段。

{
    "q": "Plumbers and dinosaurs",
    "hybrid": {
        "semanticRatio": 0.9,
        "embedder": "default"
    }
}

embedder:您在索引设置中配置的选项中的一个嵌入器。

semanticRatio:一个浮点值,范围从 011 是完全语义搜索;0 是完全匹配的全文搜索;默认值为 0.5,它混合了这两种方法。

您对语义比率的控制直接影响搜索结果的排名。更高的语义比率将重点转移到查询背后的上下文和含义,对语义上更相关的结果进行更高排名。 

另一方面,较低的语义比率会增加在排名过程中赋予关键字准确性的权重,将与您的特定搜索词密切匹配的结果置于最前。

实验性向量搜索 API 中的重大更改

Meilisearch v1.6 在向量搜索 API 中引入了一些重大更改。

以前,您可以在不指定模型的情况下发送向量。现在,您必须在设置中定义一个模型

"embedders": {
    "default": {
      "source": "userProvided",
      "dimensions": 512
    }
}

由于 Meilisearch 现在支持多个嵌入器,因此它已将向量提交格式从数组更新为 JSON 对象。

  • 预览格式:“_vectors”: [[0.0, 0.1]]
  • 新格式:“_vectors”: {“image2text”: [0.0, 0.1, …]}

有关这些更新的详细信息,请参阅 文档

有关深入的技术信息,请探索 系列文章 on Arroy,一个基于 Spotify 的 Annoy 并使用 Rust 开发的开源存储库。这个库由 Meilisearch 引擎团队创建和维护,专门用于搜索与指定查询向量接近的空间中的向量。

性能优化

改进的索引速度

我们很高兴分享 Meilisearch 索引性能的重大改进。我们最近的测试,包括包含频繁和部分文档更新的场景,已经显示出令人印象深刻的结果:索引时间减少了高达 50%,在某些情况下,甚至高达 75%。 

由于我们最新的优化,Meilisearch 现在存储和预先计算的数据更少。此外,在文档更新期间,它只重新索引或删除必要的数据。例如,在电子商务数据集中,更新产品的库存水平会导致仅重新索引“库存”字段,而不是整个产品文档。

磁盘空间使用量减少

Meilisearch 减少了内部数据存储,导致磁盘上的数据库大小更紧凑。使用大约 15Mb 的数据集,我们观察到数据库大小减少了 40% 到 50%

此增强功能不仅减少了数据库的大小,而且提高了它的稳定性,随着文档数量的增加,空间节省更加明显。

新功能:自定义接近度精度

为了进一步减少索引速度,Meilisearch 现在允许您根据您的特定需求调整 接近度排名规则 的准确性。

接近度排名规则在计算上要求很高,可能会导致更长的索引时间。降低其准确性可以极大地提高性能,并且在大多数情况下,它不会显着影响结果的相关性。

要调整它的影响 配置 proximityPrecision 设置

curl \
  -X PATCH 'http://localhost:7700/indexes/books/settings/proximity-precision' \
  -H 'Content-Type: application/json'  \
  --data-binary '{
    "proximityPrecision": "byAttribute"
  }'

默认的 proximityPrecision 设置是 byWord,它基于确切的词语距离计算接近度。 

byAttribute 设置将同一个属性中的词语视为接近,无论它们的精确距离如何。

使用 byAttribute 可以提高索引速度,但它可能会稍微改变结果的相关性。这在词语之间的接近度很重要的搜索中更加明显。

例如,当您浏览歌曲歌词或长文章时,例如尝试在大量维基百科页面中找到“world war”,您可能会得到包含这些词语但并不一定彼此靠近或按预期顺序排列的结果。这也适用于 短语搜索 和涉及 多词同义词 的搜索,其中词语的特定组合至关重要。

新功能:任务队列 Webhook

Meilisearch 现在提供了一个 Webhook 功能,以便在异步任务完成(成功、失败或被取消)时通知自定义 URL。

此功能对于简化工作流程特别有用,可以节省您轮询任务路由的时间。

在启动时使用以下环境变量设置您的 Webhook

MEILI_TASK_WEBHOOK_URL=https://mywebsite.com/my-super-webhook?user=1234&number=8

MEILI_TASK_WEBHOOK_AUTHORIZATION_HEADER='Bearer 12340987546wowowlolol'

您也可以使用相应的命令行选项。

设置完成后,Webhook 会以 JSON Lines (ndjson) 格式 将有效负载发送到您指定的 URL,其中包含已完成任务的列表

//POST HTTP request to https://myproject.com/mywebhook?common=people

{"uid":4,"indexUid":"movie","status":"failed","type":"indexDeletion","canceledBy":null,"details.deletedDocuments":0,"error.message":"Index `movie` not found.","error.code":"index_not_found","error.type":"invalid_request","error.link":"https://docs.meilisearch.com/errors#index_not_found","duration":"PT0.001192S","enqueuedAt":"2022-08-04T12:28:15.159167Z","startedAt":"2022-08-04T12:28:15.161996Z","finishedAt":"2022-08-04T12:28:15.163188Z"}
{"uid":5,"indexUid":"movie","status":"failed","type":"indexDeletion","canceledBy":null,"details.deletedDocuments":0,"error.message":"Index `movie` not found.","error.code":"index_not_found","error.type":"invalid_request","error.link":"https://docs.meilisearch.com/errors#index_not_found","duration":"PT0.001192S","enqueuedAt":"2022-08-04T12:28:15.159167Z","startedAt":"2022-08-04T12:28:15.161996Z","finishedAt":"2022-08-04T12:28:15.163188Z"}

实验性功能:限制批处理任务的数量

为了加快索引过程,Meilisearch 会对类似的 任务 进行大批量处理。但是,过多的 排队的任务 有时会导致崩溃或停滞。

要控制批处理任务的数量,请在启动时使用命令行参数 --experimental-max-number-of-batched-tasksMEILI_EXPERIMENTAL_MAX_NUMBER_OF_BATCHED_TASKS 环境变量或 配置文件 设置限制。

贡献者致谢

我们非常感谢所有参与此版本的社区成员。我们要感谢 @Karribalu@vivek-26Meilisearch 的帮助。我们还要特别感谢我们的 SDK 维护者 🦸


这就是 v1.6 的全部内容!这篇发布文章重点介绍了最重要的更新。有关详尽的清单,请阅读 Github 上的更改日志

订阅 新闻稿,随时了解 Meilisearch 的一切。要详细了解 Meilisearch 的未来并帮助塑造它,请查看我们的 路线图 并参加我们的 产品讨论

对于其他任何事项,请加入我们的开发人员社区,加入 Discord