映射 (Mapping)
映射是定义文档及其包含的字段如何存储和索引的过程。
每个文档都是字段的集合,每个字段都有自己的 数据类型。在映射数据时,您需要创建一个映射定义,其中包含与文档相关的字段列表。映射定义还包括 元数据字段(例如 _source 字段),用于自定义如何处理文档关联的元数据。
根据您所处的数据旅程阶段,使用 动态映射 和 显式映射 来定义数据。例如,您可以显式映射那些不想使用默认设置的字段,或者为了更好地控制创建哪些字段。然后,您可以允许 Elasticsearch 动态映射其他字段。在同一个索引中结合使用动态映射和显式映射,对于数据中既有已知字段又有未知字段的情况特别有用。
在 7.0.0 版本之前,映射定义包含类型名称。Elasticsearch 7.0.0 及更高版本不再接受默认映射。映射类型的移除提供了更多信息。
当您使用 动态映射时,Elasticsearch 会自动检测文档中字段的数据类型并为您创建映射。如果您索引了包含新字段的其他文档,Elasticsearch 将自动添加这些字段。您可以向顶级映射以及内部的 object 和 nested 字段添加字段。动态映射可以帮助您快速入门,但由于自动字段类型推断,对于您的特定用例可能会产生次优的结果。
使用 动态模板来定义自定义映射,这些映射会根据匹配条件应用于动态添加的字段。
使用 显式映射通过为每个字段指定数据类型来定义映射。这建议用于生产环境用例,因为您可以完全控制数据的索引方式,以满足您的特定需求。
定义自己的映射使您能够:
- 定义哪些字符串字段应被视为全文检索字段。
- 定义哪些文本字段可以通过语义搜索机器学习模型自动向量化。
- 定义哪些字段包含数字、日期或地理位置。
- 使用无法自动检测的数据类型(例如
geo_point和geo_shape)。 - 选择日期值的 格式,包括自定义日期格式。
- 创建自定义规则来控制 动态添加字段的映射。
- 优化字段以进行部分匹配。
- 执行特定于语言的文本分析。
通常,以不同方式索引同一字段以实现不同目的是很有用的。例如,您可能希望将字符串字段同时索引为用于全文搜索的文本字段和用于排序或聚合数据的关键字字段。或者,您可能选择使用多种语言分析器来处理包含用户输入的字符串字段的内容。
使用 运行时字段进行模式更改而无需重新索引。您可以结合使用运行时字段和索引字段,以平衡资源使用和性能。您的索引会更小,但搜索性能会更慢。
在搜索请求中定义运行时字段,以尝试不同的映射选项,并通过在搜索请求期间覆盖映射中的值来修复索引映射值中的错误。
对于您预先知道的字段,应在创建索引时定义显式映射。随着数据的发展,您仍然可以随时向映射添加新字段。
使用 更新映射 API 来更新现有的映射。
在大多数情况下,您无法更改已映射字段的映射。这些更改需要 重新索引。
但是,在某些条件下您可以更新映射:
您可以随时动态或显式地向现有映射添加新字段。
您可以为现有字段添加新的 多字段。
- 在映射更新之前索引的文档在更新或重新索引之前,不会具有新多字段的值。在映射更改后索引的文档将自动具有新多字段的值。
在索引中定义过多的字段会导致映射爆炸,这可能会导致内存溢出错误,并造成难以恢复的局面。
考虑这样一种情况,即插入的每个新文档都会引入新字段,例如使用 动态映射时。每个新字段都会添加到索引映射中,随着映射的增长,这可能会成为一个问题。
使用 映射限制设置来限制字段映射的数量(无论是手动还是动态创建的),并防止文档导致映射爆炸。