已知限制
目前,Meilisearch 有一些已知的限制。其中一些限制是出于有意的设计权衡,而另一些则归因于 Meilisearch 在底层使用的键值存储 LMDB。
本指南涵盖了无法更改的硬性限制。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
配置此限制。
主键值的长度
限制: 主键值的长度限制为 511 个字节。
说明: Meilisearch 将主键值存储为 LMDB 键,这是一种数据类型,其大小限制为 511 个字节。如果主键值超过 511 个字节,则包含这些文档的任务将失败。
单个 filterableAttributes
值的长度
限制: 单个 filterableAttributes
值的长度限制为 468 个字节。
说明: Meilisearch 将 filterableAttributes
值存储为 LMDB 中的键,这是一种数据类型,其大小限制为 511 个字节,Meilisearch 在此基础上增加了 44 个字节的边距。请注意,这仅适用于单个值——例如,genres
属性可以包含任意数量的值,例如 horror
、comedy
或 cyberpunk
,只要它们中的每一个都小于 468 个字节。
最大筛选深度
限制: 使用 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
限制)不影响分面搜索,仅影响搜索文档的查询。