Search code examples
elasticsearchindicesdynamic-mapping

Create Index with Dynamic mapping


I'm trying to create an index with dynamic mapping. It seems like there are some error in the mapping template. The dataset contains string, numeric value and dates. I've to accommodate all those.

mapping = {
    "settings": {
        "number_of_shards": 2,
        "number_of_replicas": 1
    },
    "mappings": {
        "_doc": { 
            "properties": {  
                "details": {
                    "dynamic_templates": [
                       {
                         "name_template": {
                           "match": "*",
                           "mapping": {
                             "type": "string",
                             "dynamic": True
                           }
                         }
                       }
                     ]
    
        }
    }

this is the code I'm using to create new index

if es.indices.exists(index="es_index") == False:
   index_creation = es.indices.create(index="es_index", ignore=400, body=mapping)
   print("index created: ",index_creation)

I'm getting the error

 index created:  {'error': {'root_cause': 
[{'type': 'mapper_parsing_exception', 'reason': 'Root mapping definition has 
unsupported parameters:  [details : {dynamic_templates=[{name_template=
{mapping={dynamic=true, type=string}, match=*}}]}]'}], 'type': 'mapper_parsing_exception', 'reason': 'Failed to parse mapping [_doc]: 
Root mapping definition has unsupported parameters:  [details : {dynamic_templates=[{name_template={mapping={dynamic=true, type=string}, match=*}}]}]', 'caused_by': {'type': 'mapper_parsing_exception', 'reason': 'Root mapping definition has unsupported parameters:  [details : {dynamic_templates=[{name_template={mapping={dynamic=true, type=string}, match=*}}]}]'}}, 'status': 400}

Solution

  • You're not doing dynamic templates correctly, here is how it should look like. dynamic_templates should be in its own array as a sibling of properties. Also you don't need to specify _doc:

    mapping = {
      "settings": {
        "number_of_shards": 2,
        "number_of_replicas": 1
      },
      "mappings": {
        "dynamic_templates": [
          {
            "name_template": {
              "path_match": "details.*",
              "mapping": {
                "type": "text"
              }
            }
          }
        ],
        "properties": {
          "details": {
              "type": "object"
          }
        }
      }
    }