Meilisearch 存在一些已知的限制。其中部分限制是出于设计权衡的考虑,而另一些则源于其底层使用的键值存储引擎 LMDB

本文涵盖无法更改的硬性限制。Meilisearch 还有一些 可以 调整的默认限制,例如 100MB 的默认负载限制默认返回 20 条结果的搜索限制

Meilisearch Cloud 最大上传大小

限制: 使用 Meilisearch Cloud 界面时的最大文件上传大小为 20MB。

说明: 处理大文件可能导致用户体验下降和性能问题。如需向 Meilisearch Cloud 项目添加超过 20MB 的数据集,请使用 添加文档端点meilisearch-importer

查询词最大数量

限制: 每个搜索查询最多考虑 10 个词项。如果搜索查询包含超过 10 个单词,第 10 个之后的所有单词将被忽略。

说明: 包含大量搜索词的查询会导致响应时间延长。这违背了我们提供即时输入即时搜索的快速体验目标。

每个属性的最大词数

限制: Meilisearch 每个属性最多可索引 65535 个词位。超过 65535 个词位限制的单词将被静默忽略。

说明: 此限制出于相关性考虑而设置。特定属性中包含的单词越多,搜索查询的相关性就会越低。

示例

假设有三个相似的查询:Hello WorldHello, WorldHello - World。由于我们的分词器工作机制,每个查询都会被不同地处理,并在内部数据库中占据不同数量的”位置”。

如果查询是 Hello World

  • Hello 占据属性的位置 0
  • World 占据属性的位置 1

如果查询是 Hello, World

  • Hello 占据属性的位置 0
  • , 占据属性的位置 8
  • World 占据属性的位置 9

, 占据8个位置,因为它是硬分隔符。您可以在数据类型文章中了解更多关于单词分隔符的信息。

如果查询是 Hello - World

  • Hello 占据属性的位置 0
  • - 占据属性的位置 1
  • World 占据属性的位置 2

- 占据1个位置,因为它是软分隔符。您可以在数据类型文章中了解更多关于单词分隔符的信息。

单文档最大属性数量

限制: Meilisearch 每个文档最多可索引 65,536 个属性。如果文档包含超过 65,536 个属性,将会抛出错误。

说明: 此限制出于性能和存储考虑。文档字段过多会导致内部数据结构过大,进而导致磁盘数据库过大,降低搜索性能。

单索引最大文档数量

限制: 一个索引最多可包含 4,294,967,296 个文档。

说明: 这是32位无符号整数的最大值。由于Meilisearch引擎内部使用无符号整数来标识文档,因此这是索引中能存储的最大文档数量。

最大并发搜索请求数

限制说明: Meilisearch 最多同时处理 1000 个搜索请求。

原因解释: 此限制旨在防止 Meilisearch 队列中积压无限量请求,导致内存占用无限制增长。当队列已满时收到新请求,Meilisearch 会随机丢弃一个搜索请求并返回 503 too_many_search_requests 错误,同时在 Retry-After 响应头中设置 10 秒重试间隔。可通过 --experimental-search-queue-size 参数配置此限制。

主键值长度限制

限制说明: 主键值最大长度为 511 字节。

原因解释: Meilisearch 使用 LMDB 键值存储主键,该数据类型最大支持 511 字节。若主键值超过此限制,包含这些文档的任务将执行失败。

可筛选属性值长度限制

限制说明: 单个 filterableAttributes 属性值最大长度为 468 字节。

原因解释: Meilisearch 将 filterableAttributes 值作为 LMDB 键存储(该类型最大支持 511 字节),并保留 44 字节余量。注意此限制仅针对单个属性值——例如 genres 属性可包含任意数量的值(如 horrorcomedycyberpunk),只要每个值不超过 468 字节即可。

筛选条件最大嵌套深度

限制说明: 使用 filter 搜索参数 时,筛选条件最大嵌套深度为 2000 层。

原因解释: 混合使用 ANDOR 运算符会形成嵌套逻辑结构。过度嵌套可能导致栈溢出。

示例

以下过滤器由多个过滤表达式组成。由于这些语句全部使用 OR 运算符连接,因此没有嵌套结构:

genre = "romance" OR genre = "horror" OR genre = "adventure"

OR 替换为 AND 不会改变过滤器结构。以下过滤器的嵌套层级仍为 1:

genre = "romance" AND genre = "horror" AND genre = "adventure"

只有当交替使用 ANDOR 运算符时才会产生嵌套。以下示例获取仅属于用户 1 的文档,或同时属于用户 23 的文档:


# AND 嵌套在 OR 内部,形成第二层嵌套
user = 1 OR user = 2 AND user = 3

添加括号可以更直观地展示嵌套深度:


# 深度 2
user = 1 OR (user = 2 AND user = 3)


# 深度 4
user = 1 OR (user = 2 AND (user = 3 OR (user = 4 AND user = 5)))


# 虽然这个过滤器更长,但其嵌套深度仍为 2
user = 1 OR (user = 2 AND user = 3) OR (user = 4 AND user = 5) OR user = 6

整数字段的大小限制

限制条件: Meilisearch 只能精确表示 -2⁵³ 到 2⁵³ 之间的整数。

说明: Meilisearch 将数值存储为双精度浮点数。这种方式提高了精度并扩大了可表示的数值范围,但对于超过特定阈值的数值会导致精度损失。

每次搜索返回结果的最大数量

限制条件: 默认情况下,Meilisearch 每次搜索最多返回 1000 条文档。

说明: Meilisearch 限制了返回的搜索结果最大数量,以保护您的数据库免受恶意抓取。您可以通过修改分页索引设置中的 maxTotalHits 属性来调整此限制。maxTotalHits 仅适用于搜索路由,对使用 POST 获取文档使用 GET 获取文档端点没有影响。

大型数据集与内部错误

限制: 在索引大型文档批次时,Meilisearch 可能会抛出内部错误。

说明: 索引大型文档批次(例如超过 3.5GB 的 JSON 文件)可能导致 Meilisearch 打开过多的文件描述符。根据您的机器配置,这可能会达到系统默认的资源使用限制并触发内部错误。在运行 Meilisearch 之前,请使用 ulimit 或类似工具提高资源消耗限制。例如,在 UNIX 环境中执行 ulimit -Sn 3000 将允许打开的文件描述符数量提升至 3000。

最大数据库容量

限制: 在 Linux 环境下,Meilisearch 支持的最大索引容量约为 80TiB。出于性能考虑,建议将索引保持在 2TiB 以下。

说明: 只要活动数据库的总大小不超过操作系统分配给单个进程的最大虚拟地址空间,Meilisearch 就可以容纳任意大小的索引。在 64 位 Linux 系统上,此限制约为 80TiB。

任务数据库最大容量

限制: Meilisearch 支持的任务数据库最大容量为 10GiB。

说明: 根据您的配置情况,10GiB 大约对应 500万到1500万个任务。当任务数据库超过100万个条目时(平均约占用1GiB空间),Meilisearch 会尝试自动删除已完成的任务,同时继续正常接收新任务。这能确保任务数据库不会占用过多资源。如果数据库达到10GiB限制,Meilisearch 会记录警告日志表明引擎工作异常,并拒绝接收新任务。

单实例最大索引数量

限制: 只要单个索引大小不超过2TiB,Meilisearch 可以容纳任意数量的索引。当处理更大索引时,只要所有索引总大小不超过操作系统的虚拟地址空间限制,Meilisearch 最多可容纳20个索引。

说明: 虽然 Meilisearch 支持2TiB以下的任意数量索引,但在短时间内访问数百个不同数据库可能导致性能下降,应尽量避免这种情况。

分面搜索限制

限制:搜索分面值时,Meilisearch 最多返回100个分面。

说明: 设置返回分面数量的上限是为了在可用性和结果全面性之间取得平衡。分面搜索允许用户过滤大量分面列表,从而快速找到与查询相关的分类。这与搜索文档索引不同。分面索引设置(如 maxValuesPerFacet 限制)不会影响分面搜索,仅作用于文档搜索查询。