Meilisearch v1.6
Meilisearch 1.6 带来混合搜索和索引速度的显著提升。

我们宣布 Meilisearch 1.6 正式发布。让我们深入了解一些最重要的变化。您也可以在 GitHub 上查看完整的更新日志。
Meilisearch 1.6 也可在Meilisearch Cloud上使用,包括所有实验性功能。
实验性功能:混合搜索
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
:一个介于 0
到 1
之间的浮点值;1
表示完全语义搜索;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, …]}
有关这些更新的详细信息,请参阅文档。
如需深入的技术信息,请浏览有关Arroy的系列文章,Arroy 是一个基于 Spotify 的 Annoy 并用 Rust 开发的开源仓库。这个由 Meilisearch 引擎团队创建和维护的库专门用于在空间中搜索靠近指定查询向量的向量。
性能优化
提高索引速度
我们很高兴地宣布 Meilisearch 索引性能的重大提升。我们最近的测试,包括频繁和部分文档更新的场景,都显示出令人印象深刻的结果:索引时间减少了高达 50%,在某些情况下,甚至高达 75%。
得益于我们最新的优化,Meilisearch 现在存储和预计算的数据更少。此外,在文档更新期间,它仅重新索引或删除必要的数据。例如,在电子商务数据集中,更新产品的库存水平只会重新索引“库存”字段,而不是整个产品文档。
减少磁盘空间使用
Meilisearch 减少了内部数据存储,从而使磁盘上的数据库大小更紧凑。对于大约 15MB 的数据集,我们观察到数据库大小减少了 40% 到 50%。
这项改进不仅减少了数据库大小,还提高了其稳定性,随着文档数量的增加,空间节省会更加明显。
新功能:自定义接近度精度
为了进一步提高索引速度,Meilisearch 现在允许您根据自己的特定需求调整接近度排名规则的准确性。
接近度排名规则计算量大,可能导致索引时间延长。降低其准确性可以大大提高性能,在大多数情况下,它不会显著影响结果的相关性。
要调整其影响,请配置 proximityPrecision
设置
curl -X PATCH 'http://:7700/indexes/books/settings/proximity-precision' -H 'Content-Type: application/json' --data-binary '{ "proximityPrecision": "byAttribute" }'
默认的 proximityPrecision
设置为 byWord
,它根据确切的词距离计算接近度。
byAttribute
设置将同一属性中的词视为接近,无论它们的确切距离如何。
使用 byAttribute
可以提高索引速度,但可能会稍微改变结果的相关性。这在词语之间距离很重要的搜索中会更加明显。
例如,当您浏览歌曲歌词或长篇文章时,比如试图在一堆维基百科页面中查找“世界大战”,您可能会得到包含这些词但它们不一定紧密相邻或按所需顺序排列的结果。对于短语搜索和涉及多词同义词的搜索也是如此,在这些搜索中,词语的特定组合至关重要。
新功能:任务队列 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-tasks
、环境变量 MEILI_EXPERIMENTAL_MAX_NUMBER_OF_BATCHED_TASKS
或配置文件设置限制。
贡献者致谢
我们非常感谢所有参与此版本发布的社区成员。我们要感谢 @Karribalu 和 @vivek-26 对 Meilisearch 的帮助。我们还要特别感谢我们的 SDK 维护者 🦸
v1.6 的内容就到这里了!本发布帖子重点介绍了最重要的更新。如需完整列表,请阅读 Github 上的更新日志。
订阅时事通讯,随时了解 Meilisearch 的最新发布、博客文章和新闻。要了解 Meilisearch 的未来并帮助塑造它,请查看我们的路线图并参与我们的产品讨论。
如有其他问题,请加入我们在 Discord 上的开发者社区。