dynamic

By default, fields can be added dynamically to a document, or to inner objects within a document, just by indexing a document containing the new field. For instance:

DELETE my_index 

PUT my_index/my_type/1 
{
  "username": "johnsmith",
  "name": {
    "first": "John",
    "last": "Smith"
  }
}

GET my_index/_mapping 

PUT my_index/my_type/2 
{
  "username": "marywhite",
  "email": "mary@white.com",
  "name": {
    "first": "Mary",
    "middle": "Alice",
    "last": "White"
  }
}

GET my_index/_mapping 

First delete the index, in case it already exists.

This document introduces the string field username, the object field name, and two string fields under the name object which can be referred to as name.first and name.last.

Check the mapping to verify the above.

This document adds two string fields: email and name.middle.

Check the mapping to verify the changes.

The details of how new fields are detected and added to the mapping is explained in Dynamic Mapping.

The dynamic setting controls whether new fields can be added dynamically or not. It accepts three settings:

true

Newly detected fields are added to the mapping. (default)

false

Newly detected fields are ignored. New fields must be added explicitly.

strict

If new fields are detected, an exception is thrown and the document is rejected.

The dynamic setting may be set at the mapping type level, and on each inner object. Inner objects inherit the setting from their parent object or from the mapping type. For instance:

PUT my_index
{
  "mappings": {
    "my_type": {
      "dynamic": false, 
      "properties": {
        "user": { 
          "properties": {
            "name": {
              "type": "string"
            },
            "social_networks": { 
              "dynamic": true,
              "properties": {}
            }
          }
        }
      }
    }
  }
}

Dynamic mapping is disabled at the type level, so no new top-level fields will be added dynamically.

The user object inherits the type-level setting.

The user.social_networks object enables dynamic mapping, so new fields may be added to this inner object.

The dynamic setting is allowed to have different settings for fields of the same name in the same index. Its value can be updated on existing fields using the PUT mapping API.