映射(mapping)是定义文档及其包含字段的存储和索引方式的一组过程
字段映射需要考虑的问题:
1)、哪个string类型的字段应该作为全文索引;
2)、哪些字段应该包含数字,日期或者地理位置;
3)、日期类型值应该被如何格式化;
4)、自定义规则来控制动态添加字段的映射;
映射的定义包含以下两个部分:
1、ES索引结构元字段
标识元字段:表示文档相关元数据
序号 | 类型 | 说明 |
---|---|---|
1 | _index | 表示文档所属索引名称 |
2 | _type | 表示文档所属索引的类型名称,7.x之后均为_doc |
3 | _id | 文档唯一id |
文档数据元字段
序号 | 类型 | 说明 |
---|---|---|
1 | _source | 文档原始JSON数据 |
2 | _size | _source字段内容的字节大小(需安装mapper-size插件) |
索引元字段
序号 | 类型 | 说明 |
---|---|---|
1 | _field_names | 记录索引文档的所有non_null值的字段 |
2 | _ignored | 文档中所有在索引时指定无需索引字段(使用ignore_malformed标识) |
路由元字段
序号 | 类型 | 说明 |
---|---|---|
1 | _routing | 自定义路由值,将文档路由到指定分片 |
其它元字段
序号 | 类型 | 说明 |
---|---|---|
1 | _meta | 由应用指定的元数据,可看做应用的标识数据 |
2、文档内容属性
字段类型
1)、简单类型有text,keyword,date,long,double,boolean或ip;
2)、支持json分层的类型,如object或者nested;
3)、专门类型,如geo_point,geo_shape或completion;
实际场景中我们可能希望在不同场景以不同的方式使用相同的字段,这可以使用多字段(multi-fields)映射处理,例如一个string类型字段可以被映射成text字段以用于全文检索,同时也可以作为提个keyword类型用于排序或者聚合操作,甚至可以将同一个字段使用不同的分词器(standard analyzer、english analyzer、french analyzer)进行分词处理;
防止字段映射冲突的设置
同一个索引当中映射太多的字段可能会导致映射冲突,进而会导致内存不足以及数据无法恢复的情况;
在开启动态映射的情况下,若新插入的文档中有未被映射的字段,在插入之时新的字段将会添加到索引映射当中,这样随着映射的增加可能会导致问题;
以下设置可以限制索引映射字段的数量以防止产生映射冲突情况:
序号 | 类型 | 说明 |
---|---|---|
1 | index.mapping.total_fields.limit | 索引映射字段最大值,字段和对象的映射以及字段别名都计入此限制,默认值1000 |
2 | index.mapping.depth.limit | 索引字段的最大深度,以内部对象的数量衡量;若所有字段都在跟对象级别定义,则深度为1,若有一个对象映射,则深度为2,以此类推,默认值20; |
3 | index.map |