Elasticsearch 映射
映射就是Mapping,它用来定义一个文档以及文档所包含的字段该如何被存储和索引。所以,它其实有点类似于关系型数据库中表的定义。
映射分类
动态映射 / 静态映射
动态映射,顾名思义,就是自动创建出来的映射。
静态映射指定是手动创建的映射。
ES 根据存入的文档,自动分析出来文档中字段的类型以及存储方式,这种就是动态映射。
例如,新建一个索引,查看索引信息:
1 | PUT blog |
结果如下:
1 | { |
在创建好的索引信息中,我们可以看到,mappings 为空,这个 mappings 中保存的就是映射信息。
现在我们向索引中添加一个文档,如下:
1 | PUT blog/_doc/1 |
文档添加成功后,就会自动生成mappings。
1 | GET blog/_mapping |
可以看到, date 字段的类型为 date, title 的类型有两个, text 和 keyword。(ES 5 之前字符串类型只有一个 string类型)
默认情况下,文档中如果新增了字段,mappings中也会自动新增进来。
有的时候,如果希望新增字段时,能够抛出异常来提醒开发者,这个可以通过 mappings 中的 dynamic 属性来配置。
dynamic 有三种取值:
- true : 默认,自动添加新字段。
- false: 忽略新字段。
- strict: 严格模式,发现新字段,会抛出异常。
具体配置方式如下,创建索引时指定mappings(其实就是静态映射):
1 | PUT blog |
我们此时添加文档,如下图:
可以看到我们没有配置 date 字段的映射,添加文档时出现错误。
动态映射还有一个日期检测的问题。
例如新建一个索引,然后添加一个含有日期的文档,如下:
1 | PUT blog |
添加成功后,remark字段会被推断为日期类型。
此时remark字段就无法存储其他类型数据。
要解决这个问题,可以使用静态映射,即在索引定义时,将remark指定为text类型。也可以关闭日期检测。
关闭日期检测:
1 | PUT blog |
此时日期类型就会被当成文本来处理。
类型推断
ES 中动态映射类型推断方式如下:
JSON中的数据 | 自动推断出来的数据类型 |
---|---|
null | 没有字段被添加 |
true/false | boolean |
浮点数字 | float |
数字 | long |
JSON 对象 | object |
数组 | 数组中的第一个非空值决定 |
String | text/keyword/date/double/long 都有可能 |