ES之动态映射
2022/8/22 23:23:03
本文主要是介绍ES之动态映射,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
1. 定义
与关系型数据库不同的是其不需要先定义表结构,而可以根据写入文档的内容,来推断字段和数据类型,创建索引结构,这就是dynamic mapping,动态映射的由来。
有时这是想要的行为有时又不希望这样。
可以用 dynamic
配置来控制这种行为 ,可接受的选项如下:
true
动态添加新的字段(默认true):根据输入文档的内容,自动推断字段和类型,创建mappingfalse
忽略新的字段:无法根据输入文档的内容,自动创建mapping,需要手动创建mappingstrict
如果遇到新字段抛出异常:同非动态模式,区别在于,非动态模式,输入的文档中如果有字段不在mapping中,依然可以存储和读取,但是该字段不在mapping中,因此也无法根据该字段进行检索;但严格模式,无法存储,会直接报错,严格模式实际上就类似于关系型数据库中的表了。
2. 案例
2.1 动态模式
- es中还没有index1索引,直接往index1中写入文档1
- 这时候es中就有了索引index1,查询index1的mapping
可见age被推断成long型
,string类型的name被推断成多字段类型,第一个类型是text
,第二个类型是keyword
。
- 往已有的index1中写入文档2,出现了新的字段address
- 这时候address被自动加入索引mapping中
动态映射默认有一个规则,即请求中文档的什么json类型对应es中什么数值类型,也可以通过动态模板(dynamic template)来覆盖这个规则,实现自定义推测规则,具体可以参考ES官网。
上述字段age被推测成long类型,如果非要往age中写入string类型的值,则会报错。如下图所示
2.2 非动态模式
某些场景下,不需要进行动态映射,如需要显示设置mapping。
- 显式设置mapping,类似于关系型数据库建表操作
- 查询index2 mapping
- 插入文档1,字段与mapping保持一致
- 插入文档2,增加新的字段address
- 查询index2的mappings,看是否
address
会自动添加到mapping中
- 查询全部文档,可见文档2中的
address
字段值,说明存储成功
- 在address字段上进行匹配查询,无法匹配到结果,将索引指定为非动态映射后,无法进行自动推断,但是该字段的值是可以被存储,可是无法在该字段上进行查询。
2.3 严格模式
- 设置严格模式
- 写入文档1,增加了一个字段
address
,直接报错,连写都写不进去了
这篇关于ES之动态映射的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-05-13TiDB + ES:转转业财系统亿级数据存储优化实践
- 2024-05-09“2024鸿蒙零基础快速实战-仿抖音App开发(ArkTS版)”实战课程已上线
- 2024-05-09聊聊如何通过arthas-tunnel-server来远程管理所有需要arthas监控的应用
- 2024-05-09log4j2这么配就对了
- 2024-05-09nginx修改Content-Type
- 2024-05-09Redis多数据源,看这篇就够了
- 2024-05-09Google Chrome驱动程序 124.0.6367.62(正式版本)去哪下载?
- 2024-05-09有没有大佬知道这种数据应该怎么抓取呀?
- 2024-05-09这种运行结果里的10.100000001,怎么能最快改成10.1?
- 2024-05-09企业src漏洞挖掘-有意思的命令执行