文档
文档是由一个或多个字段组成的对象。每个字段由属性及其关联的值组成。文档充当组织数据的容器,是 Meilisearch 数据库的基本构建块。要搜索文档,您必须首先将其添加到索引中。
如果两个索引包含完全相同的文档,则它们之间不会共享任何内容。相反,这两个文档将被视为不同的文档。根据索引的设置,文档可能具有不同的大小。
结构
重要术语
- 文档:包含数据(以一个或多个字段的形式)的对象
- 字段:一组链接在一起的两个数据项:属性和值
- 属性:字段的第一部分。充当其关联值的名称或描述
- 值:字段的第二部分,由任何有效的 JSON 类型的数据组成
- 主字段:所有文档中都必须存在的特殊字段。它包含主键和文档标识符
字段
字段是一组链接在一起的两个数据项:属性和值。文档由字段组成。
属性是一个区分大小写的字符串,用作字段的名称,允许您存储、访问和描述数据。
该数据是字段的值。每个字段都有一个由其值决定的数据类型。每个值都必须是有效的 JSON 数据类型。
如果值是字符串,则它最多可以包含 65535 个位置。超过 65535 位置限制的单词将被忽略。
如果字段包含对象,Meilisearch 会在索引期间使用点表示法将其展平,并将对象的键和值带到文档本身的根级别。此展平的对象仅是中间表示形式——您将在搜索时获得原始结构。您可以在我们的专用指南中阅读有关此内容的更多信息。
使用排名规则,您可以决定哪些字段比其他字段更相关。例如,您可以决定最近的电影应该比旧电影更相关。您还可以将某些字段指定为可显示或可搜索。
可显示和可搜索的字段
默认情况下,文档中的所有字段既可显示又可搜索。可显示字段包含在每个匹配的文档中,而可搜索字段则搜索匹配的查询词。
您可以使用更新设置端点,或可显示属性和可搜索属性的各自更新端点来修改此行为,以便字段是
- 可搜索但不可显示
- 可显示但不可搜索
- 既不可显示也不可搜索
在后一种情况下,该字段将在搜索期间被完全忽略。但是,它仍然会存储在文档中。
要了解更多信息,请参阅我们的可显示和可搜索的属性指南。
主字段
主字段是所有文档中都必须存在的特殊字段。它的属性是主键,其值是文档 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" }
]
}
在上面的例子中
"id"
、"title"
、"genres"
、"release-year"
和"cast"
是属性- 每个属性都与一个值相关联,例如,
"Kung Fu Panda"
是"title"
的值 - 该文档包含一个字段,其中主键属性和一个唯一的文档 ID 作为其值:
"id": "1564"
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 文档的 string
、boolean
和 number
数据类型。如果您没有为属性指定数据类型,则默认值为 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 会对其进行批处理
- 目标是同一个索引
- 是紧密连续的
同一批次中的任务共享相同的 startedAt
、finishedAt
和 duration
值。
如果任务由于文档无效而失败,它将从批次中删除。批次的其余部分仍将正常处理。如果发生 internal
错误,则整个批次将失败,并且其中的所有任务将共享相同的 error
对象。
自动批处理和任务取消
如果您要取消的任务是批次的一部分,Meilisearch 会中断整个过程,放弃所有进度,并取消该任务。然后,它会自动创建一个不包含已取消任务的新批次,并立即开始处理它。