elasticsearch mappings之dynamic的三种状态

elasticsearch mappings之dynamic的三种状态

**本文档操作,均在es7.3进行

一.动态映射(dynamic:true)

 

1.创建一个索引

PUT commodity?pretty
{
  "settings": {
		"number_of_shards": 3,
		"number_of_replicas": 2
	},
  "mappings": {
      "properties": {
        "name": {"type": "text"},
        "age": {"type": "integer"}
      }
  }
}

  查看mapping信息

{
  "commodity" : {
    "mappings" : {
      "properties" : {
        "age" : {
          "type" : "integer"
        },
        "name" : {
          "type" : "text"
        }
      }
    }
  }
}

  添加一条数据,新增字段为sex

PUT commodity/_doc/1
{
  "name": "小黑",
  "age": 18,
  "sex": "不知道"
}

  再次查看mapping

{
  "commodity" : {
    "mappings" : {
      "properties" : {
        "age" : {
          "type" : "integer"
        },
        "name" : {
          "type" : "text"
        },
        "sex" : {
          "type" : "text",
          "fields" : {
            "keyword" : {
              "type" : "keyword",
              "ignore_above" : 256
            }
          }
        }
      }
    }
  }
}

  测试查询新字段

GET commodity/_doc/_search
{
  "query": {
    "match": {
      "sex": "不知道"
    }
  }
}

  查询结果

#! Deprecation: [types removal] Specifying types in search requests is deprecated.
{
  "took" : 48,
  "timed_out" : false,
  "_shards" : {
    "total" : 3,
    "successful" : 3,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 1,
      "relation" : "eq"
    },
    "max_score" : 0.8630463,
    "hits" : [
      {
        "_index" : "commodity",
        "_type" : "_doc",
        "_id" : "1",
        "_score" : 0.8630463,
        "_source" : {
          "name" : "小黑",
          "age" : 18,
          "sex" : "不知道"
        }
      }
    ]
  }
}

  此时dymanic默认允许添加新字段

  注意: mappings 一旦创建,则无法修改。因为Lucene 生成倒排索引后就不能改了

二.静态映射(dynamic:false)

  现在,将dynamic设置为false

PUT commodity2?pretty
{
  "settings": {
		"number_of_shards": 3,
		"number_of_replicas": 2
	},
  "mappings": {
      "dynamic": false,
      "properties": {
        "name": {"type": "text"},
        "age": {"type": "integer"}
      }
  }
}

  插入一条数据

PUT commodity2/_doc/1
{
  "name": "小黑",
  "age": 18,
  "sex": "不知道"
}

  尝试查询数据,发现此时数据为空,为什么呢?

#! Deprecation: [types removal] Specifying types in search requests is deprecated.
{
  "took" : 967,
  "timed_out" : false,
  "_shards" : {
    "total" : 3,
    "successful" : 3,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 0,
      "relation" : "eq"
    },
    "max_score" : null,
    "hits" : [ ]
  }
}

  下面,我们来看看commodity2这个索引的mapping

{
  "commodity2" : {
    "mappings" : {
      "dynamic" : "false",
      "properties" : {
        "age" : {
          "type" : "integer"
        },
        "name" : {
          "type" : "text"
        }
      }
    }
  }
}

  发现了,mapping中,并没有新增sex这个字段,此时的commodity这个索引,只能新增字段,但是并不能通过这个字段查询

  总结,新字段,只能写,不能读

严格模式(dynamic:strict)

  现在,将dynamic设置为strict模式

PUT commodity3?pretty
{
  "settings": {
		"number_of_shards": 3,
		"number_of_replicas": 2
	},
  "mappings": {
      "dynamic": "strict",
      "properties": {
        "name": {"type": "text"},
        "age": {"type": "integer"}
      }
  }
}

  此时,插入数据报错

PUT commodity3/_doc/1
{
  "name": "小黑",
  "age": 18,
  "sex": "不知道"
}

  

{
  "error": {
    "root_cause": [
      {
        "type": "strict_dynamic_mapping_exception",
        "reason": "mapping set to strict, dynamic introduction of [sex] within [_doc] is not allowed"
      }
    ],
    "type": "strict_dynamic_mapping_exception",
    "reason": "mapping set to strict, dynamic introduction of [sex] within [_doc] is not allowed"
  },
  "status": 400
}

  总结,当dynamic设置为strict时,新字段是不能写入的

原文地址:https://www.cnblogs.com/jcici/p/13600824.html