Elasticsearch 映射配置(Mapping)

摘要

本文主要介绍 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
10
PUT /my-index
{
"mappings" {
"properties": {
"age": {"type": "integer"},
"email": {"type": "keyword"},
"name": {"type": "text"}
}
}
}

索引中添加字段

我们可以通过 put mapping API 在已存在的映射中新增一个或多个字段

1
2
3
4
5
6
7
8
PUT /my-index/_mapping
{
"properties": {
"content": {
"type": "text"
}
}
}

更新已索引字段

在 ES 中不能修改意见存在字段的数据类型,只能修改 缩影参数

如果需要修改一个字段的数类型,只能通过新建一个索引,再把数据导入到新的索引中

1
2
3
4
5
6
7
8
9
POST /_reindex
{
"source": {
"index": "old_index"
},
"dest": {
"index": "new_index"
}
}

重命名字段也是不允许的,我们可以通过创建字段别名的方式来实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
PUT /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