Elasticsearch Mapping
前言
Elasticsearch 的 Mapping 对应着数据库的 schema,比数据库的 schema 灵活的是 Mapping 可以是 Dynamic 的,也就是如果不定义 Mapping 还是可以往 ES 里面插入文档的。但是数据库中如果不新建表,是不能插入数据的。
1.什么是 Mapping
Mapping 类似数据库中的 schema,定义了索引中的字段名称、数据类型(字符串、数字、布尔、日期等),还可以定义字段倒排索引的相关配置。Mapping 会把 JSON 文档映射成 Lucene 所需要的扁平格式。一个 Mapping 属于一个索引的 Type,每个文档都属于一个 Type,一个 Type 有一个 Mapping 的定义。7.0开始,不需要在 Mapping 定义中指定 Type 信息。
Mapping 中定义的字段数据类型可分为三类:简单类型、复杂类型、特殊类型。
- 简单类型:Text / Keyword、Date、Integer / Floating、Boolean、IPV4 & IPV6
- 复杂类型:对象类型/嵌套类型
- 特殊类型:geo_point & geo_shape / percolator
2.什么是 Dynamic Mapping
Elasticsearch 提供了 Dynamic Mapping 机制,使我们在写入文档的时候,如果索引不存在,会自动创建索引,无需手动定义 Mappings。ES 会自动根据文档信息,推算出字段的类型,但有时候会推算不准确,例如地理位置信息。当类型如果设置不对时,会导致一些功能无法正常运行,例如 Range 查询。可以使用 GET movies/_mappings
命令查看 Mapping。
一、类型的自动识别
数字用引号的时候,会默认当成 Text,有些一类型会推导出错,比如地理位置信息。
JSON 类型 | Elasticsearch 类型 |
---|---|
字符串 | 匹配日期格式成 Date;匹配数字为 float 或者 long,该选项默认关闭;设置为 Text,并且增加 keyword 子字段 |
布尔值 | boolean |
浮点数 | float |
整数 | long |
对象 | object |
数组 | 由第一个非空数值类型所决定 |
空值 | 忽略 |
二、Dynamic Mappings 设置
当 dynamic 被设置成 false 时,存在新增字段的文档写入,该文档可以被索引,但是里面新增的字段则不会被索引。当设置成 strict 时,新增时会报错。
mapping | true | false | strict |
---|