2020-10-07

ES入门(三)Elasticsearch之Mapping(Dynamic Mapping与显示Mapping)

什么是mapping?

  • mapping类似数据库中的schema的定义,作用如下

        定义索引中的字段名称

        定义字段的数据类型,例如字符串、数字、布尔。。。

        字段,倒排索引的相关配置
     
  • mapping会把JSON文档映射成Lucene所需要的扁平文档
     
  • 一个mapping属于一个索引的type

        每个文档都属于一个type

        一个type有一个mapping定义

        7.0开始,不需要在mapping定义中指定type信息

Mapping中的字段一旦设定后,禁止直接修改。因为倒排索引生成后不允许直接修改。需要重新建立新的索引,做reindex操作。

Dynamic Mapping

    创建索引但不设置mapping的情况下put数据进索引,es会帮我们自动创建mapping


未设置mapping的情况下写入文档并查看mapping:
PUT mapping_test/_doc/1
{
  "firstName":"Chan",
  "lastName": "Jackie",
  "loginDate":"2018-07-24T10:29:48.103Z"
}

GET mapping_test/_mapping

返回的mapping结果:
{
  "mapping_test" : {
    "mappings" : {
      "_doc" : {
        "properties" : {
          "firstName" : {
            "type" : "text",
            "fields" : {
              "keyword" : {
                "type" : "keyword",
                "ignore_above" : 256
              }
            }
          },
          "lastName" : {
            "type" : "text",
            "fields" : {
              "keyword" : {
                "type" : "keyword",
                "ignore_above" : 256
              }
            }
          },
          "loginDate" : {
            "type" : "date"
          }
        }
      }
    }
  }
}

ES自动创建mapping的映射关系如下:

2020-10-07_第1张图片

能否更改mapping的字段类型,分为两种情况:

    新增字段:

        dynamic设为true时,一旦有新增的document写入,mapping也同时被更新

        dynamic设为false,mapping不会被更新,新增字段的数据无法被索引,但是信息会出现在_source中

        dynamic设为strict时,文档写入失败

    已有字段:

    一旦已经有数据写入,就不再支持修改字段定义:Lucene实现的倒排索引,一旦生成后,就不允许修改,如果希望修改字段的类型,必须Reindex,重建索引。

    原因:1. 如果修改字段的数据类型,会导致已被索引的属于无法被搜索

               2. 如果是增加新的字段,就不会有这样的影响

索引的dynamic参数设置不同,将有不同的影响:

2020-10-07_第2张图片

显示Mapping

显示设置索引的mapping语法如下:


PUT /my_index002
{
  "mappings": {
    "_doc" : {
      "properties" : {
        "dec" : {
          "type" : "text",
          "fields" : {
            "keyword" : {
              "type" : "keyword",
              "ignore_above" : 256,
              "index": true,          //默认值是true
              "index_options": "offsets",
              "null_value": "NULL"
            }
          }
        },
        "name" : {
          "type" : "text",
          "fields" : {
            "keyword" : {
              "type" : "keyword",
              "ignore_above" : 256
            }
          },
          "fielddata" : true
        },
        "price" : {
          "type" : "long"
        },
        "producer" : {
          "type" : "text",
          "fields" : {
            "keyword" : {
              "type" : "keyword",
              "ignore_above" : 256
            }
          },
          "fielddata" : true
        },
        "tags" : {
          "type" : "text",
          "fields" : {
            "keyword" : {
              "type" : "keyword",
              "ignore_above" : 256
            }
          },
          "fielddata" : true
        }
      }
    }
  }
}

其中字段下的index属性控制当前字段是否被索引。默认为true,如果设置成false,该字段不可被搜索。

四种不同级别的Index Options配置,可以控制倒排索引记录的内容:

  • docs - 记录doc id
  • fres - 记录doc id和term frequencies
  • positions - 记录doc id / term frequencies / term position
  • offsets - doc id / term frequencies / term position / character offsets

Text类型默认记录positions,其他默认为docs

记录内容越多,占用存储空间越大

如何实现对NULL也支持搜索?

只需要在创建mapping时将需要支持null搜索的字段的null_value属性设置为"NULL",上面的语法可见。

你可能感兴趣的:(es,es,elasticsearch,java,分布式)