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時,新字段是不能寫入的

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM