摘要
本文主要介绍 ES 索引的映射和映射配置,本文根据 Elasticsearch 7.6 Mapping章节整理
概念
Elasticsearch Mapping 主要是用于定义文档的格式,定义了文档中各个字段存储和索引的方式。例如:
- 某个 string 字段,存储时可以处理成全文文本模式
- 某个一个字段只能接受存数字,日期 或地理位置信息
- 定义某个存储日期的字段,格式化日期的方式
- 自定义规则来控制动态添加的字段
Mapping Type
从 7.x 版本开始每个索引只能创建一个映射类型,用于定义如何索引文档。
NOTE: 一个索引不支持多类型的说明:Removal of mapping types
一个 Mapping type 定义有如下组成:
Meta-fields(元字段)
每个文档都有与之关联的元字段,例如 _index, _type 和 _id 等,这些元字段在 mapping type 创建的时候定义。
1、身份识别相关元字段(Identity meta-field)
- _index: 指明文档属于哪个索引
- _id: 文档的id
- _type: 文档的 mapping type 定义
2、文档资源相关元字段(Document source meta-fields
- _source: 原始存入的 JSON 对象,对应的值是目标存储信息
- _size: _source 字段值得 bytes 数大小
3、索引相关元字段(indexing meta-field)
- _field_names: 文档中所有值为 非空 的字段名
- _ignored: 文档中所有因为格式错误而没有被索引的字段名
4、路由相关元字段(Routing meta-field)
- _routing: 自定义路由值,用于将文档路由至指定分片
5、其他
- _meta: 一个应用特定的元字段值(metadata)
字段(属性)
一个 mapping 类型中定义了与文档相关的多个字段(属性)
字段数据类型
对于索引来说,一个字段为了不同的查询目标而定义不同的数据类型是非常有用的。例如一个 string 字段用于全文检索可以定义成 text 类型,如果用于排序或聚合可以定义成 keyword 类型。
每个字段允许的数据类型有如下:
1、简单数据类型:
- text:
- keyword:
- date:
- long:
- double:
- boolean:
- ip
2、对复杂对象类型的支持
- object:
- nested
3、特定数据类型的支持
- geo_point
- geo_shape
- completion
防止字段爆炸
如果在一个索引中定义太多的字段,会导致 mapping 的字段爆炸,它会引起内存溢出等一些问题。
ES 索引中引入了以下配置字段来防止字段爆炸
- index.mapping.total_fields.limit: 索引中最大字段数限制。普通字段,object 中的字段,字段别名都会计入限制中,默认值为 1000
- index.mapping.depth.limit: 最大字段深度设置,其限制 object 层级深度,默认 20
- index.mapping.nested_fields.limit: nested 类型字段最大数量限制,默认 50
- index.mapping.nested_objects.limit: 在一个文档中 nested JSON 对象的数量限制,默认 10000
- index.mapping.field_name_length.limit: 字段名长度限制,默认没有限制
动态映射
有动态映射的映入,我们可以定义字段之前使用这个字段,新引入的字段可以被动态的添加索引。这是 ES 的一个重要特性之一。
创建索引
我们可以使用 create index api 来创建一个新的索引1
2
3
4
5
6
7
8
9
10PUT /my-index
{
"mappings" {
"properties": {
"age": {"type": "integer"},
"email": {"type": "keyword"},
"name": {"type": "text"}
}
}
}
索引中添加字段
我们可以通过 put mapping API 在已存在的映射中新增一个或多个字段1
2
3
4
5
6
7
8PUT /my-index/_mapping
{
"properties": {
"content": {
"type": "text"
}
}
}
更新已索引字段
在 ES 中不能修改意见存在字段的数据类型,只能修改 缩影参数
如果需要修改一个字段的数类型,只能通过新建一个索引,再把数据导入到新的索引中1
2
3
4
5
6
7
8
9POST /_reindex
{
"source": {
"index": "old_index"
},
"dest": {
"index": "new_index"
}
}
重命名字段也是不允许的,我们可以通过创建字段别名的方式来实现1
2
3
4
5
6
7
8
9
10
11
12
13
14PUT /my-index
{
"mappings": {
"properties": {
"name": {
"type": "text"
},
"alias_name": {
"type": "alias",
"path": "name"
},
}
}
}
查询映射配置
我们可以通过 get mapping API 来查看一个映射配置1
GET /my-index/_mapping
我么也可以查看某一个特定字段的配置1
GET /my-index/_mapping/field/name