Mapping

  • 类似数据库中的表机构定义,主要作用如下:
    - 定义Index下的字段名(FieldName)
    - 定义字段的类型,比如数值型、字符串型、布尔型等
    - 定义倒排索引相关的配置,比如是否索引、记录position等
## ES6.0+ type 过时
"mappings": {
        "properties": {
          "name": {
            "type": "text",
            "store": false,  
            "analyzer": "default", 
            "search_analyzer": "default", 
            "boost": 1 
          }
        }
  }

es构建graph es mapping index_es构建graph

## ES6.0+
curl -X PUT "localhost:9200/my-index?pretty" -H 'Content-Type: application/json' -d'
{
  "mappings": {
    "properties": {
      "age":    { "type": "integer" },  
      "email":  { "type": "keyword"  }, 
      "name":   { "type": "text"  }     
    }
  }
}
'

自定义Mapping

  • 自定义Mapping的api如下所示
    - Mapping 中的字段类型一旦设定后,禁止直接修改,原因如下:
    - Lucene 实现的倒排索引生成后不允许修改
    - 重新建立新的索引,然后做reidnex操作

dynamic 允许新增字段

  • 通过dynamic参数来控制字段的新增
    - true (默认)允许自动新增字段
    - false 不允许自动新增字段,但是文档可以正常写入,但无法对字段进行查询等操作
    - strict 文档不能写入,报错

copy_to

  • 将字段的值复制到目标字段,实现类似_all的作用
  • 不会出现在_source中,只用来搜索

es构建graph es mapping index_字段_02

关键字包含JohnSmith

es构建graph es mapping index_elasticsearch_03

index

  • 控制当前字段是否索引,默认为true,即记录索引,false不记录索引

index_options

  • index_options 用于控制倒排索引记录的内容,有如下4中配置
    - docs 只记录 doc id
    - freqs 记录 doc id 和 term frequencies (词频)
    - positions 记录 doc id 、trem frequencies 和 term position (支持词语查询,前后顺序)
    - offsets 记录doc id 、trem frequencies 、 term position和 character offsets (高亮)
  • text 类型默认配置为 positions,其他默认docs
  • 记录内容越多,占用空间越大
  • index_options 设定如下所示

null_value

  • 当子弹遇到null值时的处理策略,默认为null,即空值,此时es会忽略该值。可以通过设定该值设定字段的默认值

数据类型

  • 核心数据类型
    - 字符串型 text(分词)、keyword(不分词)
    - 数值型 long、integer、short、byte、double、float、half_float、scaled_float
    - 日期类型 date
    - 布尔类型 boolean
    - 二进制类型 binary
    - 范围类型 integer_range、float_range、long_range、double_range、date_range
  • 复杂数据类型
    - 数组类型 array
    - 对象类型 object
    - 嵌套类型 nested object
  • 地理位置数据类型
    - geo_point
    - geo_shape
  • 专用类型
    - 记录ip地址 ip
    - 实现自动补全 completion
    - 记录分词数 token_count
    - 记录字符串 hash 值 murmur3
    - percolator
    - join
  • 多字段特性 multi-fields
    - 允许同一个字段采用不同的配置,比如分词,常见列子如对人名实现拼音搜索,只需要在人名中新增一个子字段为 拼音即可

Dynamic Mapping

  • es 可以自动识别文档字段类型,从而降低用户使用成本,如下所示:
  • es构建graph es mapping index_字符串_04

  • es 是依靠JSON文档的字段类型来实现自动识别字段类型,支持类型如下:
  • es构建graph es mapping index_字段_05


  • es构建graph es mapping index_字段_06

  • 日期的自动识别可以自行匹配日期格式,以满足各种需求
    - 默认是[“strict_date_optional_time”,“yyyy/MM/dd HH:mm:ss Z|| yyyy/MM/dd Z”]
    - dynamic_date_formats 可以自定义日期类型
    - date_datection 可以关闭日期自动识别的机制
  • 字符串是数字是,默认不会自动识别为整型,因为字符串中出现数字是完全合理的
    - numeric_detection 可以开启字符串中数字的自定识别,如下图:
  • es构建graph es mapping index_elasticsearch_07

Dynamic Templates

  • 允许根据es自动识别的数据类型、字段名等来动态设定字段类型,可以实现如下效果:
    - 所有字符串类型都设定为keyword类型,即默认不分词
    - 所有以message开头的字段都设定为text类型,即分词
    - 所有以 long_ 开头的字段都设定为 long类型
    - 所有自动匹配为double类型的都设定为float类型,以节省空间
  • 匹配规则一般有如下几个参数:
    - match_mapping_type 匹配es自动识别的自短类型,如 boolean,long,string等
    - match, unmatch 匹配字段名
    - path_match,path_unmatch 匹配路径 object
  • 字符串默认使用 keyword类型
    - es 默认会为字符串设置为text类型,并添加一个keyword的字词段
  • 以 message 开头的字段都设置为text类型
  • double 类型设定为float,节省空间

自定义 Mapping 建议

  • 自定义 Mapping 的操作步骤如下:
    - 1.写入一条文档到es的临时索引中,获取es自动生成的mapping
    - 2.修改步骤1得到的 mapping, 自定义相关配置
    - 3.使用步骤2的mapping 创建实际所需索引

索引模板

  • 索引模板,英文为 Index Template, 主要用于新建索引时自动应用预先设定的配置,
  • 简化索引创建的操作步骤
    - 可以设定索引的配置和 mapping
    - 可以有多个模板,根据order设置,order大的覆盖小的配置
  • 索引模板API, endpoint 为 _template,如下所示:
  • es构建graph es mapping index_es构建graph_08


  • es构建graph es mapping index_自定义_09

  • 获取与删除的API如下:
  • es构建graph es mapping index_字符串_10

store

使用 elasticsearch 时碰上了很迷惑的地方,我看官方文档说 store 默认是 no ,我想当然的理解为也就是说这个 field 是不会 store 的,但是查询的时候也能查询出来,经过查找资料了解到原来 store 的意思是,是否在 _source 之外在独立存储一份,这里要说一下 _source 这是源文档,当你索引数据的时候, elasticsearch 会保存一份源文档到 _source ,如果文档的某一字段设置了 store 为 yes (默认为 no),这时候会在 _source 存储之外再为这个字段独立进行存储,这么做的目的主要是针对内容比较多的字段,放到 _source 返回的话,因为_source 是把所有字段保存为一份文档,命中后读取只需要一次 IO,包含内容特别多的字段会很占带宽影响性能,通常我们也不需要完整的内容返回(可能只关心摘要),这时候就没必要放到 _source 里一起返回了(当然也可以在查询时指定返回字段)。

对内容太长的字段,将 store 设置为 yes ,一般来说还应该在 _source 排除 exclude 掉这个字段,这时候索引的字段,不会保存在 _source 里了,会独立存储一份,查询时 _source 里也没有这个字段了,但是还是可以通过指定返回字段来获取,但是会有额外的 IO 开销,因为 _source 的读取只有一次 IO ,而已经 exclude 并设置 store 的字段,是独立存储的需要一个新的 IO 。

值得注意的是,虽然这个字段没有存储在 _source 了,但是这个字段还是可以 match 和高亮的。当然如果 _source 不存储,并且 store 也为 no 这时候,数据就不会返回了,也不能高亮了。但是还是可以 match 的,前提是这个字段映射时 index 属性设置了 analyzed ,lucence 对这个字段建立了倒排索引。如果 index 设置为 no 这时候等于就是没有映射这个字段了,既不能查询,也不能得到返回。设置为 not_analyzed 不会建立倒排索引,但是可以被查询到。