Elasticsearch的Dynamic Mapping 和常见字段类型

本文所阐述以下几个知识点:

  • 什么是mapping?
  • 字段的数据类型
  • 什么是Dynamic Mapping?
  • 能否更改Mapping的字段类型

什么是mapping?

mapping类似数据库的schema(简单的理解为对象)的定义,作用如下:

定义索引中的字段名称
定义字段的数据类型,例如:字符串,数字,布尔值等
字段,倒排索引的相关配置,Analyzed or Not Analyzed,Analyzed

mapping会把json文档映射称Lucene所需的扁平格式

一个mapping属于一个索引的type

  • 每个文档都属于一个type
  • 一个type又一个mapping的定义
  • es7.0开始,不需要在mapping定义中指定type信息

字段的数据类型

几种简单的类型

  • Text(会分词)/Keyword(不会分词,存入整个对象)
  • Date(日期类型)
  • Integer(整型)/Floating(浮点型)
  • Boolean(布尔值)
  • ipv4&ipv6

复杂类型:就是对象以及对象的嵌套

特殊类型:

  • geo_point:存储经纬度的类型,注:会牺牲一定的精度
  • geo_shape:用来存储,点集、线、多边形、多边形集等多种集合形状
  • percolator:任何包含json对象的字段都可以配置为percolator字段

什么是Dynamic Mapping

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

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

能否更改Mapping的字段类型

  • 两种情况
    • 新增字段:
      • Dynamic设置为true,只要有新增字段写入,Mapping也会更新
      • Dynamic设置为false,Mapping不会被更新,新增字段不会被索引,但是会出现在_source(原始文档)中
      • Dynamic设置成Strict,文档写入失败
    • 对方已有字段,一旦已经有数据写入,就不再支持修改字段定义
      • Lucene实现的倒排索引,一旦生成后,就不允许修改
    • 如果希望改变字段类型,必须Reindex API,重建索引
      注:因为修改了字段的数据类型,会导致已被索引的无法被搜索
      新增字段就不一样,因为没经过es的任何操作

总结:

truefalsestrict
文档可索引yesyesno
字段可索引yesnono
Mapping被更新yesnono
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值