本文所阐述以下几个知识点:
- 什么是mapping?
- 字段的数据类型
- 什么是Dynamic Mapping?
- 能否更改Mapping的字段类型
什么是mapping?
mapping类似数据库的schema(简单的理解为对象)的定义,作用如下:
定义索引中的字段名称
定义字段的数据类型,例如:字符串,数字,布尔值等
字段,倒排索引的相关配置,Analyzed or Not Analyzed,Analyzed
mapping会把json文档映射称Lucene所需的扁平格式
一个mapping属于一个索引的type
- 每个文档都属于一个type
- 一个type又一个mapping的定义
- es7.0开始,不需要在mapping定义中指定type信息
字段的数据类型
几种简单的类型
- Text(会分词)/Keyword(不会分词,存入整个对象)
- Date(日期类型)
- Integer(整型)/Floating(浮点型)
- Boolean(布尔值)
- ipv4&ipv6
复杂类型:就是对象以及对象的嵌套
特殊类型:
- geo_point:存储经纬度的类型,注:会牺牲一定的精度
- geo_shape:用来存储,点集、线、多边形、多边形集等多种集合形状
- percolator:任何包含json对象的字段都可以配置为percolator字段
什么是Dynamic Mapping
在写入文档的时候,如果索引不存在,会自动创建索引
Dyamic Mapping的机制,使得我们无需手动定义Mapping
Elasticsearch会自动根据文档信息,推算出字段的类型
但是有时候会推算的不对,例如地理位置信息
当类型如果设置不对时,会导致一些功能无法正常运行,例如:Range查询
JSON类型 | Elasticsearch类型 |
---|---|
字符串 | 1.匹配日志格式,设置成Date。2.配置数字设置成float或者long,该选项默认关闭。3.设置为Text,并且增加keyword 子字段 |
布尔值 | Boolean |
浮点数 | Float |
整数 | long |
对象 | Object |
数组 | 由第一个非空数值的类型所决定 |
空值 | 忽略 |
能否更改Mapping的字段类型
- 两种情况
- 新增字段:
- Dynamic设置为true,只要有新增字段写入,Mapping也会更新
- Dynamic设置为false,Mapping不会被更新,新增字段不会被索引,但是会出现在_source(原始文档)中
- Dynamic设置成Strict,文档写入失败
- 对方已有字段,一旦已经有数据写入,就不再支持修改字段定义
- Lucene实现的倒排索引,一旦生成后,就不允许修改
- 如果希望改变字段类型,必须Reindex API,重建索引
注:因为修改了字段的数据类型,会导致已被索引的无法被搜索
新增字段就不一样,因为没经过es的任何操作
- 新增字段:
总结:
true | false | strict | |
---|---|---|---|
文档可索引 | yes | yes | no |
字段可索引 | yes | no | no |
Mapping被更新 | yes | no | no |