目录
映射
映射是定义文档及其所包含的字段是如何存储和索引的过程。
例如,使用映射定义:
- 哪些字符串字段应该被视作全文本字段
- 哪些字段包含数组、日期或定位
- 是否文档中所有字段的值都应该被索引进_all字段
- 日期值的格式
- 添加规则来控制动态添加字段的映射
1.映射类型
每一个索引具有一个映射类型,映射类型决定了文档如何构成索引。
一个映射类型包含:
元字段
元字段被用于定制与之关联的文档元数据如何被对待处理。例如,元字段包含文档的_index、_type、_id与_source字段。
字段或属性
一个映射类型包含与文档相关的字段或属性列表。
2.字段数据类型
每一个字段都有一个数据类型,数据类型可以是:
- 简单类型,如text、keyword、date、long、double、boolean或ip
- 支持JSON层次性的类型,如object、nested
- 专用类型,如geo_point、geo_shape或completion
为了不同的目的,用不同的方法对相同的字段进行索引通常非常有用。
例如,string字段可以被索引为text字段用于全文本搜索,索引为keyword字段用于排序或聚合。或者,可以使用standard analyzer、english analyzer与french analyzer来索引一个string字段。
防止映射爆炸的设置
在一个索引中定义过多的字段是导致映射爆炸的条件,这可能造成内存溢出错误与难以恢复的困难情况。
这个问题可能比预期情况还要普遍。
例如,考虑这种情况,每一个新插入的文档都引入了新的字段,这在动态映射中非常常见。
每次插入的文档都包含新的字段,这些字段都将进入索引的映射。
这在数据量很少的时候不必担心,但是随着映射的增加,这将成为问题。
以下设置可以限制手动或动态创建的字段映射的数量,以防糟糕的文档造成的映射爆炸:
index.mapping.total_fields.limit
索引中字段的最大数量,默认为1000。
index.mapping.depth.limit
字段中的最大深度,用于度量内部对象的数量。例如,定义在根对象层的所有字段的深度为1,如果存在一个对象映射,此时深度为2,默认为20。
index.mapping.nested_fields.limit
索引中内嵌字段的最大数量,默认为50。索引一个具有100个内嵌字段的文档实际上索引了101个文档,因为每一个内嵌的文档都被作为一个独立隐藏文档被索引。
3.动态映射
字段与映射类型在被使用之前不需要被定义。
由于动态映射,新的字段名称将会被自动添加,只需要索引一个文档即可。
新字段可以被添加到顶级映射类型,内部对象与内嵌字段。
动态映射规则可以被配置为定制用于新字段的映射。
4.显式映射
尽管动态映射很有用,但由于使用者自身比Elasticsearch更了解数据,所以有些时候需要指定显式映射。
可以在创建索引时创建字段映射,也可以使用PUT 映射API添加字段到已存在的索引中。
5.更新已存在的字段映射
除了有文档记录的地方,已存在的字段映射不能被更新。
改变映射意味着已经索引的文档无效。相反,应该创建具有正确映射的新索引,然后重建索引,将数据导入新索引中。
如果只想要将字段重命名并不改变它的映射,这将令引入别名字段有了意义。