已知限制
目前,Meilisearch 存在一些已知限制。其中一些限制是由于有意设计的权衡造成的,而另一些则可以归因于 LMDB,Meilisearch 在后台使用的键值存储。
本指南涵盖无法更改的硬性限制。Meilisearch 还有一些可以更改的默认限制,例如 默认有效负载限制为 100MB,以及 默认搜索限制为 20 个命中。
查询词语的最大数量
限制: 每个 搜索查询 考虑的术语最大数量为 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
配置此限制。
主键值的长度
限制: 主键值限制为 512 字节。
解释: Meilisearch 将主键值存储为 LMDB 密钥,这是一种数据类型,其大小限制为 512 字节。如果主键值超过 512 字节,包含这些文档的任务将失败。
单个 filterableAttributes
值的长度
限制: 单个 filterableAttributes
值限制为 512 字节。
解释: Meilisearch 将 filterableAttributes
值存储为 LMDB 中的密钥,这是一种数据类型,其大小限制为 512 字节。请注意,这仅适用于单个值——例如,genres
属性可以包含任意数量的值,例如 horror
、comedy
或 cyberpunk
,只要它们中的每一个都小于 512 字节。
最大过滤深度
限制: 使用 filter
搜索参数 的搜索可能具有最大过滤深度为 2000。
解释: 混合和交替使用 AND
和 OR
运算符过滤会导致创建嵌套的逻辑结构。过度嵌套会导致堆栈溢出。
示例
以下过滤器由多个过滤器表达式组成。由于这些语句都使用 OR
运算符链接在一起,因此没有嵌套。
genre = "romance" OR genre = "horror" OR genre = "adventure"
将 OR
替换为 AND
不会改变过滤器的结构。以下过滤器的嵌套级别保持为 1
genre = "romance" AND genre = "horror" AND genre = "adventure"
嵌套仅发生在交替使用 AND
和 OR
运算符时。以下示例获取仅属于 user
1
的文档,或属于用户 2
和 3
的文档。
# AND is nested inside OR, creating a second level of nesting
user = 1 OR user = 2 AND user = 3
添加括号可以帮助可视化嵌套深度。
# Depth 2
user = 1 OR (user = 2 AND user = 3)
# Depth 4
user = 1 OR (user = 2 AND (user = 3 OR (user = 4 AND user = 5)))
# Though this filter is longer, its nesting depth is still 2
user = 1 OR (user = 2 AND user = 3) OR (user = 4 AND user = 5) OR user = 6
整数字段的大小
限制: 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 会记录一个警告,表明引擎工作不正常,并拒绝排队新任务。
一个实例中的最大索引数量
限制: 只要它们的大小不超过 2TiB,Meilisearch 就可以容纳任意数量的索引。当处理更大的索引时,只要它们的总大小不超过操作系统的虚拟地址空间限制,Meilisearch 就可以容纳最多 20 个索引。
解释: 虽然 Meilisearch 支持在 2TiB 以下的任意数量的索引,但在短时间内访问数百个不同的数据库可能会导致性能下降,应尽可能避免这种情况。
分面搜索限制
限制: 当 搜索分面值 时,Meilisearch 最多返回 100 个分面。
解释: 对返回分面的最大数量的限制是为了在可用性和全面结果之间取得良好的平衡。分面搜索允许用户过滤大量的分面,以便他们可以快速找到与他们的查询相关的类别。这与搜索文档索引不同。分面索引设置(例如 maxValuesPerFacet
限制)不会影响分面搜索,只会影响通过文档搜索的查询。