16 - Dynamic Mapping和常见类型字段

什么是Mapping

  • Mapping类似数据库中的schema的定义,作用如下
    • 定义索引中的字段的名称
    • 定义字段的数据类型,例如字符串,数字,布尔
    • 字段,倒排索引的相关配置,(Analyzed or Not Analyzed, Analyzer)
  • Mapping会把JSON文档映射成Lucene所需要的扁平格式
  • 一个Mapping属于一个索引的Type
  • 7.0开始,不需要再Mapping中指定type信息

字段的数据类型

  • 简单类型
    • Text / Keyword
    • Date
    • Integer / Floating
    • Boolean
    • IPV4 & IPV6
  • 复杂类型:对象和嵌套类型
    • 对象类型 / 嵌套类型
  • 特殊类型
    • geo_point
    • geo_shape
    • percolator

什么是Dynamic Mapping

  • 在写入文档时候,如果索引不存在,会自动创建索引
  • Dynamic Mapping的机制,使得我们无需手动定义Mappings。Elasticsearch会自动根据文档信息,推算出字段的类型
  • 但是有时候会推算的不对,例如地理位置信息
  • 当类型如果设置不对时,会导致一些功能无法正常运行,例如Range查询
mapping查询方式

mapping结果示例

类型自动识别

JSON类型 Elasticsearch类型
字符串 1. 匹配日期格式,设置成Date
2. 匹配数字设置为float或者long,该选项默认关闭
3. 设置为Text,并且增加keyword子字段
布尔值 boolean
浮点数 float
整数 long
对象 Object
数组 由第一个非空数值的类型所决定
空值 忽略

能否更改Mapping的字段类型

  • 两种情况
    • 新增加字段
      • Dynamic设置为true时,一旦有新增字段的文档写入,Mapping也同时被更新
      • Dynamic设置为false时,Mapping不会被更新,新增字段的数据无法被索引,但是信息会出现在_source中
    • 对已有字段,一旦已经有数据写入,就不再支持修改字段的定义
      • Lucene实现的倒排索引,一旦生成后,就不允许修改
    • 如果希望改变字段类型,必须Reindex API,重建索引
  • 原因
    • 如果修改了字段的数据类型,会导致已经被索引的属性无法被搜索
    • 但是如果是增加新的字段,就不会有这样的影响

控制Dynamic Mapings

"true" "false" "strict"
文档可索引 YES YES NO
字段可索引 YES NO NO
Mapping被更新 YES NO NO
  • 当dynamic被设置成false时候,存在新增字段的数据写入,该数据可以被索引
  • 当设置成Strict模式的时候,数据写入直接报错
控制mapping
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容