已知限制

    Meilisearch 有许多已知限制。其中一些限制是故意权衡设计的结果,而另一些则归因于 Meilisearch 在底层使用的键值存储 LMDB

    本文介绍了无法更改的硬性限制。Meilisearch 还有一些可以更改的默认限制,例如 100MB 的默认负载限制20 个命中的默认搜索限制

    Meilisearch Cloud 最大上传大小

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

    解释: 处理大型文件可能会导致用户体验和性能下降。要将大于 20mb 的数据集添加到 Meilisearch Cloud 项目,请使用添加文档端点meilisearch-importer

    最大查询词数

    限制: 每个搜索查询中考虑的最大术语数为 10。如果搜索查询包含超过 10 个单词,则第 10 个单词之后的所有单词都将被忽略。

    解释: 包含许多搜索词的查询可能会导致响应时间过长。这与我们提供快速边搜索边输入体验的目标背道而驰。

    每个属性的最大字数

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

    解释: 出于相关性原因,强制执行此限制。给定属性中的单词越多,搜索查询的相关性就越低。

    示例

    假设您有三个类似的查询:Hello WorldHello, WorldHello - World。由于我们的分词器的工作方式,它们中的每一个都将被不同地处理,并在我们的内部数据库中占用不同数量的“位置”。

    如果您的查询是 Hello World

    如果您的查询是 Hello, World

    注意

    , 占用 8 个位置,因为它是一个硬分隔符。您可以在我们的关于数据类型的文章中阅读有关单词分隔符的更多信息。

    如果您的查询是 Hello - World

    注意

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

    单个 filterableAttributes 值的长度

    限制: 单个 filterableAttributes 值限制为 468 字节。

    解释: Meilisearch 将 filterableAttributes 值存储为 LMDB 中的键,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 运算符时才会发生嵌套。以下示例获取仅属于 user 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 将记录警告,指示引擎工作不正常,并拒绝将新任务排队。

    实例中的最大索引数

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

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

    Facet 搜索限制

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

    解释: 已实施返回的最大 facet 数量的限制,以便在可用性和全面的结果之间提供良好的平衡。Facet 搜索允许用户过滤大量的 facet 列表,以便他们可以快速找到与其查询相关的类别。这与搜索文档索引不同。分面索引设置(例如 maxValuesPerFacet 限制)不影响 facet 搜索,仅影响搜索文档的查询。