Meilisearch 有一些已知限制。其中一些限制是经过有意设计权衡的结果,而另一些则可归因于 Meilisearch 内部使用的键值存储 LMDB 本文涵盖了无法更改的硬性限制。Meilisearch 还有一些可以更改的默认限制,例如默认有效负载限制为 100MB,以及默认搜索限制为 20 条命中记录

Meilisearch 云上传大小限制

限制: 使用 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 字节的数据类型。如果主键值超过 511 字节,则包含这些文档的任务将失败。

单个 filterableAttributes 值的长度

限制: 单个 filterableAttributes 值限制为 468 字节。 解释: Meilisearch 将 filterableAttributes 值存储为 LMDB 中的键,这是一种大小限制为 511 字节的数据类型,Meilisearch 会为其添加 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 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 将记录警告,指示引擎未正常工作并拒绝排队新任务。

实例中最大索引数

限制: Meilisearch 可以容纳任意数量的索引,只要它们的大小不超过 2TiB。处理更大的索引时,Meilisearch 最多可以容纳 20 个索引,只要它们的总大小不超过操作系统的虚拟地址空间限制。 解释: 尽管 Meilisearch 支持任意数量小于 2TiB 的索引,但在短时间内访问数百个不同的数据库可能会导致性能下降,应尽可能避免。

分面搜索限制

限制: 搜索分面值时,Meilisearch 最多返回 100 个分面。 解释: 限制返回分面的最大数量是为了在使用性和全面结果之间提供良好的平衡。分面搜索允许用户过滤大量分面,以便他们可以快速找到与其查询相关的类别。这与通过文档索引进行搜索不同。分面索引设置(例如 maxValuesPerFacet 限制)不会影响分面搜索,仅影响通过文档进行查询的查询。
© . This site is unofficial and not affiliated with Meilisearch.