与关系型数据库不同的是其不需要先定义表结构,而可以根据写入文档的内容,来推断字段和数据类型,创建索引结构,这就是dynamic mapping,动态映射的由来。
有时这是想要的行为有时又不希望这样。
可以用 dynamic
配置来控制这种行为 ,可接受的选项如下:
true
动态添加新的字段(默认true):根据输入文档的内容,自动推断字段和类型,创建mappingfalse
忽略新的字段:无法根据输入文档的内容,自动创建mapping,需要手动创建mappingstrict
如果遇到新字段抛出异常:同非动态模式,区别在于,非动态模式,输入的文档中如果有字段不在mapping中,依然可以存储和读取,但是该字段不在mapping中,因此也无法根据该字段进行检索;但严格模式,无法存储,会直接报错,严格模式实际上就类似于关系型数据库中的表了。2.1 动态模式
可见age被推断成long型
,string类型的name被推断成多字段类型,第一个类型是text
,第二个类型是keyword
。
动态映射默认有一个规则,即请求中文档的什么json类型对应es中什么数值类型,也可以通过动态模板(dynamic template)来覆盖这个规则,实现自定义推测规则,具体可以参考ES官网。
某些场景下,不需要进行动态映射,如需要显示设置mapping。
address
会自动添加到mapping中
address
字段值,说明存储成功
address
,直接报错,连写都写不进去了