为了能够将时间域视为时间,数字域视为数字,字符串域视为全文或精确值字符串, 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 中不提供专门的数组类型。但是任何字段,都可以包含多个相同类型的数值