映射,也就是 mappings,用于定义一个文档以及文档中的字段应该如何被存储和索引。
分为 动态映射和静态映射
动态映射
动态映射:ES 根据存储的文档,自动分析出来文档中字段的类型以及存储方式,无需我们自己动手。
eg:
1. 新建一个索引
2. 查看索引的状态
3. 向索引中增加一条文档
4. 再次查看索引的状态
date 和 title 字段类型都有两个 text 和 keyword
在 ES 中,text 字段用于全文搜索,而keyword 字段用于关键字检索,之后会细说
自动增加字段
默认情况下,文档中新增了字段,mappings 中也会自动新增。
可以通过配置 mappings 的 dynamic 属性,来控制 ES 中文档新增字段后,mappings 的行为。
dynamic 的属性取值如下:
- true : 默认值,当文档中增加新字段后,mappings 会自动增加新字段
- false : ~ mappings 会忽略新字段
- strict: 严格模式,发现新字段会抛出异常来提醒开发者
测试如下:
1. 先在创建索引的时候指定对应的 mappings
2. 后尝试向索引中增加文档,并且文档对应的数据类型不与定义时的mappings 相符合
日期检测问题
- 我们新建一个索引,并且向其中放入一条数据
- 查看 es 建立的映射
发现 remark 被推断为 date 类型。那么此时 remark 字段其实就无法存储其他类型的数据了 - 尝试改变数据,发现报错如下:
- 解决这个问题,可以使用静态映射,或者关闭这个日期检测
关闭日期检测如下:
这个操作必须要在创建索引的时候执行,如果 es 已经给我们生成了mappings 此时再关闭日期检测,会报错
类型推断
es 中,对文档中的数据推断出来的数据类型如下:
Json中的数据 | ES自动推断的数据类型 |
---|---|
null | 这个字段不会被添加 |
true/false | boolean |
浮点数 | float |
数字 | long |
JSON 对象 | object |
数组 | 数组中第一个非空值决定 |
string | text/keyword/date/double/long 都有可能 |
静态映射
在创建索引时指定 mappings,我们自己手动定义好文档中字段的类型以及存储方式