已知限制
Meilisearch 有许多已知限制。这些是您无法更改的硬限制,在设计应用程序时应考虑这些限制。
Meilisearch 有许多已知限制。其中一些限制是经过有意设计权衡的结果,而另一些则可归因于 Meilisearch 内部使用的键值存储 LMDB。
本文涵盖了无法更改的硬限制。Meilisearch 也有一些可以更改的默认限制,例如 默认有效载荷限制为 100MB 和 默认搜索限制为 20 条结果。
Meilisearch Cloud 最大上传大小
限制: 使用 Meilisearch Cloud 界面时,最大文件上传大小为 20MB。
解释: 处理大型文件可能会导致用户体验下降和性能问题。要将大于 20MB 的数据集添加到 Meilisearch Cloud 项目,请使用 添加文档端点 或 meilisearch-importer
。
最大查询词数
限制: 每个 搜索查询 考虑的最大词数是 10 个。如果搜索查询包含超过 10 个词,第 10 个词之后的所有词都将被忽略。
解释: 包含许多搜索词的查询可能会导致响应时间过长。这与我们提供快速“边输入边搜索”体验的目标背道而驰。
每个属性的最大词数
限制: Meilisearch 每个属性最多可索引 65535 个位置。任何超过 65535 个位置限制的词都将被静默忽略。
解释: 实施此限制是为了保证相关性。给定属性中的词越多,搜索查询的相关性就越低。
示例
假设您有三个相似的查询:Hello World
、Hello, World
和 Hello - 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 字节的数据类型。如果主键值超过 511 字节,包含这些文档的任务将失败。
单个 filterableAttributes
值的长度
限制: 单个 filterableAttributes
值的长度限制为 468 字节。
解释: Meilisearch 将 filterableAttributes
值存储为 LMDB 中的键,这是一种大小限制为 511 字节的数据类型,Meilisearch 会为其添加 44 字节的余量。请注意,这仅适用于单个值——例如,genres
属性可以包含任意数量的值,例如 horror
、comedy
或 cyberpunk
,只要它们中的每一个都小于 468 字节。
最大过滤深度
限制: 使用 filter
搜索参数 的搜索最大过滤深度为 2000。
解释: 混合和交替使用 AND
和 OR
运算符的过滤器会创建嵌套逻辑结构。过度嵌套可能导致栈溢出。
示例
以下过滤器由多个过滤表达式组成。由于这些语句都用 OR
运算符链接,因此没有嵌套
将 OR
替换为 AND
不会改变过滤器结构。以下过滤器的嵌套级别仍为 1
嵌套只发生在交替使用 AND
和 OR
运算符时。以下示例获取属于用户 1
的文档,或同时属于用户 2
和 3
的文档
添加括号有助于可视化嵌套深度
整数字段的大小
限制: Meilisearch 只能精确表示 -2⁵³ 到 2⁵³ 之间的整数。
解释: Meilisearch 将数值存储为双精度浮点数。这允许更高的精度并增加了 Meilisearch 可以表示的量级范围,但会导致 超过某些阈值的值 出现不准确。
每次搜索的最大结果数
限制: 默认情况下,Meilisearch 每次搜索最多返回 1000 个文档。
解释: Meilisearch 限制返回搜索结果的最大数量是为了保护您的数据库免受恶意抓取。您可以通过使用 分页索引设置 的 maxTotalHits
属性来更改此设置。maxTotalHits
仅适用于 搜索路由,对 使用 POST 获取文档 和 使用 GET 获取文档 端点没有影响。
大型数据集和内部错误
限制: 在索引大量文档批次时,Meilisearch 可能会抛出内部错误。
解释: 索引大量文档批次,例如大小超过 3.5GB 的 JSON 文件,可能导致 Meilisearch 打开过多的文件描述符。根据您的机器,这可能会达到系统默认的资源使用限制并触发内部错误。在运行 Meilisearch 之前,请使用 ulimit
或类似工具来增加资源消耗限制。例如,在 UNIX 环境中调用 ulimit -Sn 3000
可以将允许打开的文件描述符数量提高到 3000。
最大数据库大小
限制: Meilisearch 在 Linux 环境中支持最大索引大小约为 80TiB。出于性能原因,Meilisearch 建议将索引保持在 2TiB 以下。
解释: 只要活动数据库的总大小低于操作系统分配给单个进程的最大虚拟地址空间,Meilisearch 就可以适应任何大小的索引。在 64 位 Linux 上,此限制约为 80TiB。
最大任务数据库大小
限制: Meilisearch 支持最大任务数据库大小为 10GiB。
解释: 根据您的设置,10GiB 应对应 5M 到 15M 个任务。一旦任务数据库包含超过 1M 个条目(平均约 1GiB),Meilisearch 会尝试自动删除已完成的任务,同时像往常一样继续将新任务排队。这确保了任务数据库不会使用过多的资源。如果您的数据库达到 10GiB 限制,Meilisearch 将记录警告,表明引擎未正常工作,并拒绝将新任务排队。
实例中索引的最大数量
限制: Meilisearch 可以容纳任意数量的索引,只要它们的大小不超过 2TiB。处理更大的索引时,Meilisearch 最多可以容纳 20 个索引,只要它们的总大小不超过操作系统的虚拟地址空间限制。
解释: 尽管 Meilisearch 支持 2TiB 以下的任意数量的索引,但在短时间内访问数百个不同的数据库可能会导致性能下降,应尽可能避免。
分面搜索限制
限制: 当 搜索分面值 时,Meilisearch 最多返回 100 个分面。
解释: 对返回分面最大数量的限制是为了在可用性和全面结果之间提供良好的平衡。分面搜索允许用户过滤大量分面列表,以便他们可以快速找到与其查询相关的类别。这与搜索文档索引不同。分面索引设置(例如 maxValuesPerFacet
限制)不影响分面搜索,仅影响通过文档进行搜索的查询。