文档

    文档是一个由一个或多个字段组成的对象。每个字段由一个属性及其关联的组成。文档充当组织数据的容器,是 Meilisearch 数据库的基本构建块。要搜索文档,必须首先将其添加到索引中。

    如果两个索引包含完全相同的文档,则它们之间不会共享任何内容。相反,这两个文档将被视为不同的文档。根据索引的设置,文档的大小可能不同。

    结构

    Diagram illustration Meilisearch's document structure

    重要术语

    字段

    一个字段是一组两个相互关联的数据项:一个属性和一个值。文档由字段组成。

    一个属性是一个区分大小写的字符串,它充当字段的名称,允许你存储、访问和描述数据。

    该数据是字段的。每个字段都有一个由其值决定的数据类型。每个值都必须是有效的JSON 数据类型

    如果值是字符串,则它最多可以包含 65535 个位置。超过 65535 个位置限制的单词将被忽略。

    如果一个字段包含一个对象,Meilisearch 会在索引期间使用点表示法将其展平,并将该对象的键和值带到文档本身的根级别。这个展平的对象只是一个中间表示形式——你将在搜索时获得原始结构。你可以在我们的专门指南中阅读更多相关内容。

    使用排名规则,你可以决定哪些字段比其他字段更相关。例如,你可能决定最近的电影应比旧电影更相关。你还可以将某些字段指定为已显示或可搜索。

    保留属性

    某些功能需要 Meilisearch 保留属性。例如,要使用地理搜索功能,你的文档必须包含一个 _geo 字段。

    保留属性总是以一个下划线 (_) 为前缀。

    显示和可搜索字段

    默认情况下,文档中的所有字段都是已显示且可搜索的。已显示字段包含在每个匹配的文档中,而可搜索字段则用于搜索匹配的查询词。

    你可以使用更新设置端点已显示属性可搜索属性的各自更新端点来修改此行为,以便字段是

    在后一种情况下,该字段将在搜索期间被完全忽略。但是,它仍然会存储在文档中。

    要了解更多信息,请参阅我们的已显示和可搜索属性指南

    主字段

    主字段是所有文档中必须存在的特殊字段。其属性是主键,其值是文档 ID。如果你尝试索引一个文档,该文档缺少主键或拥有给定索引的错误主键,则会导致错误,并且不会添加任何文档。

    要了解更多信息,请参阅主键说明

    上传

    默认情况下,Meilisearch 将所有有效载荷(因此也包括文档上传)的大小限制为 100MB。你可以使用 http-payload-size-limit 选项在运行时更改有效载荷大小限制

    Meilisearch 在索引文档时会使用大量 RAM。请注意你的RAM 可用性,因为当你增加批量大小时,这可能会导致 Meilisearch 崩溃。

    使用添加新文档端点时,请确保

    数据集格式

    Meilisearch 接受以下格式的数据集

    JSON

    以 JSON 对象表示的文档是由花括号括起来的键值对。因此,任何适用于格式化 JSON 对象的规则也适用于格式化 Meilisearch 文档。例如,属性必须是字符串,而值必须是有效的 JSON 数据类型

    Meilisearch 仅在接收到 application/json 内容类型标头时才接受 JSON 文档。

    例如,假设您正在创建一个包含电影信息的索引。一个示例文档可能如下所示:

    {
      "id": 1564,
      "title": "Kung Fu Panda",
      "genres": "Children's Animation",
      "release-year": 2008,
      "cast": [
        { "Jack Black": "Po" },
        { "Jackie Chan": "Monkey" }
      ]
    }
    

    在上面的示例中:

    NDJSON

    NDJSON 或 jsonlines 对象由单独的行组成,其中每一行都是有效的 JSON 文本,并且每一行都以换行符分隔。任何适用于格式化 NDJSON 的规则也适用于 Meilisearch 文档。

    Meilisearch 仅在接收到 application/x-ndjson 内容类型标头时才接受 NDJSON 文档。

    与 JSON 相比,NDJSON 具有更好的写入性能,并且 CPU 和内存密集程度较低。它更容易验证,并且与 CSV 不同,它可以处理嵌套结构。

    上面的 JSON 文档在 NDJSON 中如下所示:

    { "id": 1564, "title": "Kung Fu Panda", "genres": "Children's Animation", "release-year": 2008, "cast": [{ "Jack Black": "Po" }, { "Jackie Chan": "Monkey" }] }
    

    CSV

    CSV 文件将数据表示为由分隔符分隔的值序列。Meilisearch 接受 CSV 文档的 stringbooleannumber 数据类型。如果您没有为属性指定数据类型,它将默认为 string。空字段(例如 ,,, , )将被视为 null

    默认情况下,Meilisearch 使用单个逗号 (,) 作为分隔符。使用带有添加或更新文档添加或替换文档 端点的 csvDelimiter 查询参数来设置不同的字符。任何适用于格式化 CSV 的规则也适用于 Meilisearch 文档。

    Meilisearch 仅在接收到 text/csv 内容类型标头时才接受 CSV 文档。

    与 JSON 相比,CSV 具有更好的写入性能,并且 CPU 和内存密集程度较低。

    上面的 JSON 文档在 CSV 中如下所示:

      "id:number","title:string","genres:string","release-year:number"
      "1564","Kung Fu Panda","Children's Animation","2008"
    

    由于 CSV 不支持数组或嵌套对象,因此无法将 cast 转换为 CSV。

    自动批处理

    自动批处理将连续的类似操作组合成一个批次并一起处理。这显著加快了索引过程。

    当 Meilisearch 批量处理诸如文档添加和删除之类的操作时,它们:

    同一批次中的任务共享 startedAtfinishedAtduration 的相同值。

    如果由于无效文档而导致任务失败,它将从批次中删除。批次的其余部分仍将正常处理。如果发生internal错误,则整个批次将失败,并且其中的所有任务将共享相同的 error 对象。

    自动批处理和任务取消

    如果您要取消的任务是批次的一部分,则 Meilisearch 会中断整个过程,丢弃所有进度并取消该任务。然后,它会自动创建一个不包含已取消任务的新批次,并立即开始处理它。