Meilisearch 1.11
Meilisearch 1.11 通过关键改进(包括二进制量化)推进了 AI 驱动的搜索的稳定化。此版本还根据用户反馈增强了联合搜索功能。
我们很高兴推出 Meilisearch v1.11。在本文中,我们将介绍最重要的更改。有关更新的完整列表,请访问 GitHub 上的更新日志。
Meilisearch 1.11 也可在 Meilisearch Cloud 上使用 — 现在升级!
实验性:向量数据库索引性能改进
Meilisearch v1.11 引入了新的嵌入器选项:binaryQuantized
。
二进制量化通过使用 1 位值编码每个维度来压缩向量,从而显着提高性能,尤其是在具有超过 100 万个文档和超过 1024 个维度的模型的数据集中。
较小的嵌入(低于 1024 个维度)往往会产生较差的结果。维度越少,二进制向量就无法保留足够的信息以获得良好的相关性。
启用此功能会永久更新所有向量,使其仅包含 1 和 -1,这会极大地影响搜索相关性。此更改是不可逆转的。
在启用此功能之前,我们建议在开发环境中较小的或重复的索引中进行测试,以评估其对您的用例的影响。
实验性:AI 驱动的搜索改进
重大更改
此版本引入了多项重大更改以实现功能稳定。
embedder
参数变为必需
在以前的版本中,当未指定嵌入器时,默认嵌入器会自动用于搜索和类似请求。从 v1.11 开始,在执行以下操作时,现在必须指定 embedder
参数
// Semantic and hybrid search client.index('INDEX_NAME').search( query, { hybrid: { embedder: 'EMBEDDER_NAME' // mandatory as of v1.11 } } ) // Similarity search client.index('INDEX_NAME').searchSimilarDocuments({ id: 'TARGET_DOCUMENT_ID', embedder: 'EMBEDDER_NAME' // mandatory as of v1.11 })
此外,即使对于完整向量搜索(当使用 vector
而不使用 q
时),也必须包含带有 embedder
的 hybrid
对象。
client.index('INDEX_NAME').search({ vector: [0, 1, 2], hybrid: { embedder: 'EMBEDDER_NAME'// mandatory as of v1.11 } })
当传递不带 q
的 vector
时,现在忽略非零 semanticRatio
在 Meilisearch v1.11 之前,当使用 vector
和 hybrid
参数执行搜索,但不使用 q
时,除非将 hybrid.semanticRatio
设置为 1.0
,否则会发生占位符关键字搜索。在 v1.11 中,始终执行语义搜索,除非将 hybrid.semanticRatio
设置为 0.0
。
新增功能和改进
默认 OpenAI 模型更新
默认的 OpenAI 模型已从 text-embedding-ada-002
更新为新的 text-embedding-3-small
。这个新模型比传统的 ada
模型更具成本效益且更准确,以更低的成本提供了更好的性能。
新的嵌入器参数
Meilisearch 1.11 的新 documentTemplateMaxBytes
参数允许在文档的模板文本超过指定的字节限制时对其进行截断。默认情况下,它设置为 400 字节。
此更改是向后兼容的。现有的嵌入器将保留 400 字节的默认值,无需在升级期间重新计算嵌入。新限制仅在修改文档并重新呈现模板时适用。
改进的文档模板
documentTemplate
中的字段现在包括 field.is_searchable
属性。默认的 文档模板将过滤掉空字段和不在可搜索属性列表中的字段。新的默认模板仅适用于从 v1.11 开始创建的嵌入器。
// v1.11 default document template {% for field in fields %} {% if field.is_searchable and not field.value == nil %} {{ field.name }}: {{ field.value }} {% endif %} {% endfor %} // v1.10 default document template {% for field in fields %} {{ field.name }}: {{ field.value }} {% endfor %}
联合搜索改进:分面分布和统计信息
Meilisearch v1.11 为联合搜索引入了两个新选项:facetsByIndex
和 mergeFacets
。这些选项允许您请求分面分布和统计信息以获得联合搜索结果。
按索引划分的分面信息
要检索每个索引的分面分布和统计信息,请使用 facetsByIndex
选项。
{ "federation": { "facetsByIndex": { "movies": ["title", "id"], "comics": ["title"] } }, "queries": [ { "q": "Batman", "indexUid": "movies" }, { "q": "Batman", "indexUid": "comics" } ] }
响应将包括每个索引的分面分布和统计信息
{ "facetsByIndex": { "movies": { // Facet distribution for queries on the `movies` index "distribution": { "title": { "Batman returns": 1 }, "id": { "42": 1 } }, // Facet stats for queries on the `movies` index "stats": { "id": { "min": 42, "max": 42 } } }, "comics": { // Facet distribution for queries on the `comics` index "distribution": { "title": { "Batman: the killing joke": 1 } }, // Facet stats for queries on the `comics` index (empty because only numeric values are considered) "stats": {} } } }
合并的分面信息
要从单个结果中的所有索引获取分面分布和统计信息,请同时使用 facetsByIndex
和 mergeFacets
POST /multi-search { "federation": { "facetsByIndex": { "movies": ["title", "id"], "comics": ["title"] }, "mergeFacets": { "maxValuesPerFacet": 10 } }, "queries": [ { "q": "Batman", "indexUid": "movies" }, { "q": "Batman", "indexUid": "comics" } ] }
响应将包括合并的分面数据
{ "facetDistribution": { "title": { "Batman returns": 1, "Batman: the killing joke": 1 }, "id": { "42": 1 } }, "facetStats": { "id": { "min": 42, "max": 42 } } }
了解有关联合搜索及其用例的更多信息。
实验性:新的 STARTS_WITH
过滤器运算符
新的 STARTS_WITH
过滤器运算符匹配以指定字符串模式开头的所有字段值
// returns all heroes whose name starts with 'super' "filter": "hero STARTS_WITH super"
这是一项实验性功能。要启用它,请使用实验性功能端点并将 containsFilter
选项设置为 true
。请注意,这也会激活 CONTAINS
过滤器运算符。
通过此 GitHub 讨论分享您的反馈
贡献者致谢
我们要衷心感谢为本次发布做出贡献的贡献者:@iornstein 对 Meilisearch 的帮助,以及 @luflow、@tkhshtsh0917 对 charabia 的贡献。
我们还要特别感谢我们的 SDK 维护人员,他们努力工作,使 Meilisearch 能够在多种语言和框架中使用。
v1.11 版本的内容就到这里!这些发行说明仅突出显示了最重要的更新。如需查看完整列表,请阅读 Github 上的更新日志。
使用 Meilisearch Cloud 轻松升级。
订阅我们的每月新闻通讯,随时了解 Meilisearch 的最新动态。要了解更多关于 Meilisearch 的未来并帮助塑造它,请查看我们的路线图并参与我们的产品讨论。
如有任何其他问题,请加入我们在 Discord 上的开发者社区。