ElasticSearch5.x實踐_day05_05_動態Mapping

4、動態Mapping

4.1 default mapping

在mapping中使用default字段,那麼其它字段會自動繼承default中的設置。node

PUT http://node1:9200/my_index
{
	"mappings":{
		"_default_":{
			"_all":{
				"enable":false
			}
		},
		"user":{
			
		},
		"blogpost":{
			"_all":{
				"enable":true
			}
		}
	}
}

default 中的_all字段在 5.x 中已經被廢棄 ,因此上面會出異常 可是規則可用。apache

上面的mapping中,default中關閉了all字段,user會繼承_default中的配置,所以user中的all字段也是關閉的,blogpost中開啓_all,覆蓋了_default的默認配置。json

default被更新之後,只會對後面新加的文檔產生做用。數組

4.2 Dynamic field mapping

文檔中有一個以前沒有出現過的字段被添加到ELasticsearch以後,文檔的type mapping中會自動添加一個新的字段。這個能夠經過dynamic屬性去控制,dynamic屬性爲false會忽略新增的字段、dynamic屬性爲strict會拋出異常。若是dynamic爲true的話,ELasticsearch會自動根據字段的值推測出來類型進而肯定mapping:app

JSON格式的數據 自動推測的字段類型
null 沒有字段被添加
true or false boolean類型
floating類型數字 floating類型
integer long類型
JSON對象 object類型
數組 由數組中第一個非空值決定
string 有多是date類型(開啓日期檢測)、double或long類型、text類型、keyword類型

日期檢測默認是檢測符合如下日期格式的字符串:ide

[ "strict_date_optional_time","yyyy/MM/dd HH:mm:ss Z||yyyy/MM/dd Z"]

例子:post

POST http://node1:9200/my_index/my_type/1
{
  "create_date": "2015/09/02"
}
GET http://node1:9200/my_index/_mapping
-->
{
    "my_index": {
        "mappings": {
            "my_type": {
                "properties": {
                    "create_date": {
                        "type": "date",
                        "format": "yyyy/MM/dd HH:mm:ss||yyyy/MM/dd||epoch_millis"
                    }
                }
            }
        }
    }
}

關閉日期檢測:spa

PUT http://node1:9200/my_index
{
	"mappings":{
		"my_type":{
			"date_detection":false
		}
	}
}
POST http://node1:9200/my_index/my_type/1
{
  "create_date": "2015/09/02"
}

GET http://node1:9200/my_index/_mapping
-->
{
    "my_index": {
        "mappings": {
            "my_type": {
                "date_detection": false,
                "properties": {
                    "create_date": {
                        "type": "text",
                        "fields": {
                            "keyword": {
                                "type": "keyword",
                                "ignore_above": 256
                            }
                        }
                    }
                }
            }
        }
    }
}

自定義日期檢測的格式:code

PUT http://node1:9200/my_index
{
	"mappings":{
		"my_type":{
			"dynamic_date_formats":["MM/dd/yyyy"]
		}
	}
}

POST http://node1:9200/my_index/my_type/1
{
  "create_date": "09/25/2015"
}

GET http://node1:9200/my_index/_mapping
-->
{
    "my_index": {
        "mappings": {
            "my_type": {
                "dynamic_date_formats": [
                    "MM/dd/yyyy"
                ],
                "properties": {
                    "create_date": {
                        "type": "date",
                        "format": "MM/dd/yyyy"
                    }
                }
            }
        }
    }
}

開啓數字類型自動檢測:orm

PUT http://node1:9200/my_index
{
	"mappings":{
		"my_type":{
			"numeric_detection":true
		}
	}
}
POST http://node1:9200/my_index/my_type/1
{
  "my_float":   "1.0", 
  "my_integer": "1" 
}
GET http://node1:9200/my_index/_mapping
-->
{
    "my_index": {
        "mappings": {
            "my_type": {
                "numeric_detection": true,
                "properties": {
                    "my_float": {
                        "type": "float"
                    },
                    "my_integer": {
                        "type": "long"
                    }
                }
            }
        }
    }
}

4.3 Dynamic templates

動態模板能夠根據字段名稱設置mapping,以下對於string類型的字段,設置mapping爲:

"mapping": { "type": "long"}

可是匹配字段名稱爲long_*格式的,不匹配*_text格式的:

PUT http://node1:9200/my_index
{
  "mappings": {
    "my_type": {
      "dynamic_templates": [
        {
          "longs_as_strings": {
            "match_mapping_type": "string",
            "match":   "long_*",
            "unmatch": "*_text",
            "mapping": {
              "type": "long"
            }
          }
        }
      ]
    }
  }
}

PUT http://node1:9200/my_index/my_type/1
{
  "long_num": "5", 
  "long_text": "foo" 
}

寫入文檔之後,long_num字段爲long類型,long_text扔爲string類型。

4.4 Override default template

能夠經過default字段覆蓋全部索引的mapping配置,例子:

PUT _template/disable_all_field
{
  "order": 0,
  "template": "*", 
  "mappings": {
    "_default_": { 
      "_all": { 
        "enabled": false
      }
    }
  }
}
相關文章
相關標籤/搜索