为了能够将时间域视为时间,数字域视为数字,字符串域视为全文或精确值字符串, Elasticsearch 需要知道每个域中数据的类型。这个信息包含在映射中。
什么是Mapping
- Mapping类似数据库中等Schema的定义
- 定义索引中字段的名称
- 定义字段的数据类型,例如字符串,数字,布尔 。。。
- 字段、倒排索引的相关配置,(Analyzed or Not Analyzed,Analyzer)
- Mapping会把JSON文档映射成Lucene所需要的扁平格式
- 一个Mapping属于一个Type
- 每个文档都属于一个Type
- 一个Type有一个Mapping定义
- 7.0 开始,不需要在Mapping定义中指定Type信息
字段的数据类型
简单类型
- Text / Keyword
- Date
- Integer /Floating
- Boolean
- IPv4 & IPv6
复杂类型 -对象和嵌套数组
- 对象类型 / 嵌套类型
特殊类型
- geo_point & geo_shape / percolator
什么是 Dynamic Mapping (动态映射)
- 在写入文档的时候,如果索引不存在,会自动创建索引
- Dynameic Mapping 的机制,使得我们无需手动定义Mappings。Elasticsearch会自动根据文档信息,推算出字段的类型
- 但有时候会推算的不对,例如地理位置信息
- 当类型如果设置不对时,会导致一些功能无法正常运行,例如 Range查询
类型的自动识别
JSON类型 | Elasticsearch |
---|---|
字符串 | ● 匹配日期格式,设置成Date ●配置数字设置为float或者long,该选项默认关闭 ● 设置为Text,并增加keyword子字段 |
布尔值 | boolean |
浮点数 | float |
整数 | long |
对象 | Object |
数组 | 由第一个非空数值的类型所决定 |
空值 | 忽略 |
能否更改 Mapping 的字段类型
新增加字段
- Dynameic 设为
true
时,一旦有新增字段的文档写入,Mapping也同时被更新 - Dyname 设置为
false
时,Mapping不会被更新,新增字段的数据无法被索引,但是信息会出现在_source
中 - Dynameic 设置成Strice,文档写入失败
已有字段类型
一旦有数据写入,就不再支持修改字段定义
- Lucene 实现的倒排索引,一旦生成后,就不允许修改
修改 Mapping的字段类型
如果希望改变字段类型,必须Reindex API,重建索引
原因 :
- 如果修改了字段的数据类型,会导致一杯索引的属于无法被搜索
- 但是如果是增加新的字段,就不会有这样的影响
控制 Dynameic Mappings
true | false | strict | |
---|---|---|---|
文档可索引 | yes | yes | no |
字段可索引 | yes | no | no |
Mapping 被更新 | yes | no | no |
- 当 Dynameic 被设置成false时候,存在新增字段的数据写入,该数据可以被索引,但是新增字段被丢弃
- 当设置成Strict模式的时候,数据写入直接出错
如何显式定义一个Mapping
PUT movies
{
"mappings": {
//define your mappings here
}
}
自定义 Mapping 的一些建议
- 可以参考API 手册,纯手写
- 为了减少输入的工作量,减少出错概率,可以依照一下步骤
- 创建一个临时的index,写入一些样本数据
- 通过访问 Mapping API 获得该临时文件的动态 Mapping 定义
- 修改后用,使用该配置创建你的索引
- 删除临时索引
控制当前字段是否被索引
- Index - 控制当前字段是否被索引。默认为true。如果设置成false,该字段不可被搜索
- 可以减少倒排索引的开销,不会创建索引!
Index Options
- 四种不同级别的 Index Options 配置 ,可以控制倒排索引记录的内容
- docs -记录 doc id
- freqs - 记录 doc id 和 term frequencies
- positions - 记录doc id / term frequencies / term position
- offsets - doc id / term frequencies / term position / character offects
- Text 类型默认记录Postions ,其他默认为docs
- 记录内容越多,占用存储空间越大
null_value
- 需要对 Null 值实现搜索
- 只有keyword 类型支持设定 Null_Value
copy_to 设置
- _all 在7 中被copy_to所替代
- 满足一些特定对搜索要求
- copy_to 将字段对数值拷贝到目标字段,实现类似_all的作用
- copy_to 的目标字段不出现在_source 中
数组类型
- Elasticsearch 中不提供专门的数组类型。但是任何字段,都可以包含多个相同类型的数值