zoukankan      html  css  js  c++  java
  • 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时,新字段是不能写入的

  • 相关阅读:
    map侧连接
    二次排序
    倒排索引
    多表关联
    单表关联
    Shuffle
    Partitioner
    Combiner
    CSS3中的多列
    CSS3动画
  • 原文地址:https://www.cnblogs.com/jcici/p/13600824.html
Copyright © 2011-2022 走看看