ElasticSearch系列 - Mapping
dynamic Mapping
Mapping类似数据库中的schema定义,作用如下
- 定义索引中的字段的名义
- 定义字段的数据类型,例如字符串,数字,布尔
- 字段,倒排索引的相关配置
Mapping会把JSON文档映射成Lucene所需要的扁平格式。一个Mapping属于一个索引的Type (MySQL中的Table)
- 每个文档都属于一个Type
- 一个Type有一个Mapping定义
- 7.0开始,不在需要在Mapping定义指定Type信息
字段的数据类型
- 简单类型:text(全文检索)/keyword(关键词检索),Date,integer/floating,Boolean,IPV4&IPV6
- 复杂类型:对象类型/嵌套类型
- 特殊类型:geo_point geo_shape percolator (地理位置,经纬度之类)
Dynamic Mapping
在写入文档时候,如果索引不在会自动创建,es根据文档信息自动推测字段类型
有时候不准,例如地理位置信息
当类型如果设置不对,一些功能无法正常运行,例如range查询
类型的自动识别
类型 | 具体 | ES类型 |
---|---|---|
字符串 | 日期 | Date |
数字 | float/long | |
一般字符串 | text/keyword | |
布尔值 | boolean | |
浮点数 | float | |
整数 | long | |
对象 | object | |
数组 | 第一个非空数值决定 | |
空值 | 忽略 |
能否更改Mapping字段类型(mysql能否改表定义)
- 新增字段
dynamic设置为true 一旦有新增字段文档写入,Mapping更新
dynamic设置false,Mapping不会更新,新增字段无法索引,但会出现在_source中(文档可以被索引出来)
dynamic设置strict 文档写入失败
- 已有字段 一旦有数据写入无法修改字段定义;如果希望改字段类型,必须Reindex API 重建索引
Dynamic Mappings | true | false | strict |
---|---|---|---|
文档可索引 | yes | yes | no |
字段可索引 | yes | no | no |
Mapping被更新 | yes | no | no |
自定义Mapping
PUT users1
{
"mappings"