ElasticSearch 7.x mapping 定义说明

时间:2022-12-11 19:58:30

在自定义索引时,映射是定义文档及其包含的字段如何被存储和索引的过程,起着非常重要作用。

ElasticSearch 7.x mapping 定义说明

例如,使用 mapping 定义:

  • 哪些字符串字段应视为全文字段
  • 哪些字段包含数字、日期或地理位置
  • 日期值的格式
  • 用于控制动态添加字段的自定义规则

Mapping 定义主要包含

元字段

元字段用于自定义如何处理文档的关联元数据。元字段包括文档所在的索引 _index 、文档的唯一id _id 和原始数据 _source 。

字段或属性

包含与文档相关的字段或属性列表。

字段数据类型

每一个字段都有一个数据类型,如:

  • 简单类型,如 text, keyword, date, long, double, boolean, ip
  • 一种支持JSON层次结构的类型,如 object 或 nested
  • 特殊类型,如 geo_point、geo_shape 或 completion

主要分享低代码、微服务、容器化、SAAS‬、系统架构方面的的‬内容‬‬,希望‬大家‬点赞‬,评论,关注‬。

为不同的目的以不同的方式索引同一字段通常是有用的。例如,字符串字段可以作为全文搜索的文本字段索引,也可以作为排序或聚合的关键字字段索引。或者,可以使用标准分析器、英语分析器和法语分析器索引同一个字符串字段。

这就是复合字段的目的。大多数数据类型通过 fields 参数来支持多个复合字段。


防止 mappings 爆炸的设置

在索引中定义太多字段是一种可能导致映射爆炸的情况,这种爆炸可能导致内存不足和难以恢复的情况。这个问题可能比预期的更常见。例如,考虑这样一种情况:插入的每个新文档都会引入新字段。这在动态映射中很常见。每次文档包含新字段时,这些字段都会出现在索引的映射中。数据量少时这并不担心,但随着映射的增长,这可能会成为一个问题。以下设置允许您限制可以手动或动态创建的字段映射的数量,以防止错误文档导致映射爆炸:


index.mapping.total_fields.limit
# 索引中字段的最大数量。字段和对象映射以及字段别名都将计入此限制。默认值为1000。

index.mapping.depth.limit
#字段映射的最大深度,以内部对象的数量来衡量。例如,如果所有字段都在根对象级别定义,
则深度为1。如果有一个对象映射,则深度为2等。默认值为20。

index.mapping.nested_fields.limit
# 不同嵌套映射的最大数目,默认为50。

index.mapping.nested_objects.limit
# 单个文档中所有嵌套类型的最大嵌套 JSON 对象数,默认为10000。

index.mapping.field_name_length.limit
# 字段名的最大长度。默认值为 Long.MAX_value(无限制)。这个设置并不能解决映射爆炸问题,
但是如果您想限制字段长度,它可能仍然很有用。通常不需要设置此设置。默认设置是可以的,
除非用户开始添加大量具有真正长名称的字段。

ElasticSearch 7.x mapping 定义说明

动态映射

字段和映射类型在使用之前不需要定义。由于动态映射,新的字段名将自动添加,只需索引一个文档。新字段既可以添加到*映射类型,也可以添加到内部对象和嵌套字段。

动态映射规则可以配置为用于新字段的映射。


显式映射

您对数据的了解比 Elasticsearch 所能猜测的要多,因此,虽然动态映射对于开始使用非常有用,但在某些情况下,您需要指定自己的显式映射。
创建索引并将字段添加到现有索引时,可以创建字段映射。


用显式映射新建一个索引

可以使用创建索引 API 创建具有显式映射的新索引。

PUT /user-index
{
"mappings": {
"properties": {
"age": { "type": "integer" },
"email": { "type": "keyword" },
"name": { "type": "text" }
}
}
}

添加一个字段到已存在的映射中

可以使用 put方法 调用 API 向现有索引添加一个或多个新字段。
下面的示例添加 employee-id,这是一个关键字字段,其索引映射参数值为false。这意味着 employee-id 字段的值会被存储,但没有被索引且不可用于搜索。

PUT /user-index/_mapping
{
"properties": {
"employee-id": {
"type": "keyword",
"index": false
}
}
}

更新一个字段的映射

除了支持映射参数外,不能更改现有字段的映射或字段类型。更改现有字段可能会使已编制索引的数据无效。
如果需要更改字段的映射,请使用正确的映射创建新索引,并将数据重新索引到该索引中。
重命名字段将使已在旧字段名下索引的数据无效。相反,添加别名字段以创建备用字段名。


查看一个索引的字段映射

你可以通过 GET 方法访问 mapping API 查看指定索引的映射信息。

GET /user-index/_mapping

返回:

{
"user-index" : {
"mappings" : {
"properties" : {
"age" : {
"type" : "integer"
},
"email" : {
"type" : "keyword"
},
"employee-id" : {
"type" : "keyword",
"index" : false
},
"name" : {
"type" : "text"
}
}
}
}
}

查看指定字段的映射

如果只想查看一个或多个特定字段的映射,可以使用get field mapping API。
如果不需要索引的完整映射,或者索引包含大量字段,则此功能非常有用。
下面的请求返回了字段 employee-id 的映射信息。

GET /user-index/_mapping/field/employee-id

返回:

{
"user-index" : {
"mappings" : {
"employee-id" : {
"full_name" : "employee-id",
"mapping" : {
"employee-id" : {
"type" : "keyword",
"index" : false
}
}
}
}
}
}

主要分享低代码、微服务、容器化、SAAS‬、系统架构方面的的‬内容‬‬,希望‬大家‬点赞‬,评论,关注‬。