ElasticSearch-Mapping
一、什么是Mapping
- Mapping类似数据库中的schema的定义,作用如下
- 定义索引中的字段的名称
- 定义字段的数据类型,例如字符串,数字,布尔..
- 字段的索引设置
- 字段的分词器设置
- Mapping会把JSON文档映射成Lucene所需要的扁平格式
字段的数据类型
- 简单类型
- Text/Keyword
- Date
- Integer/Floating/long
- Boolean
- IPv4 & IPv6
- 复杂类型
- 对象类型
- 嵌套类型
- 特殊类型
- 地理坐标
二、什么是Dynamic Mapping
- 在写入文档的时候,如果索引不存在会自动创建索引
- Dynamic Mapping的机制,使得我们无需手动定义Mappings,Elasticsearch会自动根据文档信息,推算出字段的类型
- 但是有时候会推算得不对,例如地理位置信息
- 当类型如果设置不对时,会导致一些功能无法正常运行,例如Range查询
自动推到数据类型会出现的特殊情况:
- 数字用引号,默认当TEXT
- 日期格式会推导成Date
- 有一些类型会推导出错,例如地理位置信息
三、能否更改Mapping的字段类型
- 两种情况
- 新增加字段
- Dynamic设为true时,一旦有新增字段的文档写入,Mapping也同时被更新
- Dynamic设为false时,Mapping不会被更新,新增字段的数据无法被索引,但是信息会出现在_source中(即新增字段成功被索引进es)
- Dynamic设置成Strict,文档写入失败
- 对已有字段,一旦已经有数据写入,就不会支持修改字段定义
- Lucene实现的倒排索引,一旦生效后,就不允许修改
- 如果希望修改字段类型,必须用Reindex API 重建索引
- 修改已存在字段需Reindex原因
- 如果修改了字段的数据类型,会导致已被索引的数据无法被搜索
- 如果是增加新的字段,就不会有这样的影响
为什么修改了字段的数据类型,会导致已被索引的数据无法被索引?

四、显示Mapping设置与常见参数介绍
- index:控制当前字段是否被索引。默认为true,如果设置成false,改字段不可被搜索
Index Options
- 四种不同级别的Index Options配置,可以控制倒排索引记录的内容
- docs:记录doc id
- freqs(出现频率):记录doc id和term frequencies
- postions: 记录doc id/ term frequencies/ term position
- offsets: 记录doc id/ term frequencies/ term position/ character offsets
- Text类型默认记录postions,其它默认为docs
- 记录内容越多,占用存储空间越大
- Elasticsearch中不提供专门的数组类型。但是任何字段,都可以包含多个相同类型的数值

- 多字段特性
- 如某个text类型的字段要实现精确匹配
- 增加一个keyword字段
- 使用不同的analyzer
- 不同语言
- pinyin字段的搜索
- 还支持为搜索和索引指定不同的analyzer
五、Exact Values & Full Text
- Exact Value:包括数字、日期、具体一个字符串
- Elasticsearch中的keyword
- 全文本,非结构化的文本数据
- Elasticsearch中的text
- keyword不需要做分词处理

浙公网安备 33010602011771号