How to fix ElasticSearch 'Root mapping definition has unsupported parameters'
Problem:
You want to create an ElasticSearch index with a custom mapping or update the mapping of an existing ElasticSearch index but you see an error message like
elasticsearch.exceptions.RequestError: RequestError(400, 'mapper_parsing_exception', 'Root mapping definition has unsupported parameters: [mappings : {properties={num_total={type=integer}, approved={type=integer}, num_translated={type=integer}, pattern_length={type=integer}, num_unapproved={type=integer}, pattern={type=keyword}, num_approved={type=integer}, translated={type=integer}, untranslated={type=integer}, num_untranslated={type=integer}, group={type=keyword}}}]')
Solution
This can point to multiple issues. Essentially, ElasticSearch is trying to tell you that the structure of your JSON is not correct.
Often this error is misinterpreted as *individual field definitions being wrong,*but this is rarely the issue (and only if an individual field definition is completely malformed).
If your message is structured like
... unsupported parameters: [mappings : ...
then the most likely root cause is that you have mappings
nested inside mappings
in your JSON. This also applies if you update a mapping (put_mapping
) - in this case the outer mapping
is implicit!
Example: Your code looks like this:
es.indices.put_mapping(index='my_index, doc_type='_doc', body={
"mappings": {
"properties": {
"pattern": {
"type": "keyword"
}
}
}
})
ElasticSearch will internally create a JSON like this internally:
{
"mappings": {
"mappings": {
"properties": {
"pattern": {
"type": "keyword"
}
}
}
}
}
See that there are two mappings
inside each other? ElasticSearch does not view this as a correctly structured JSON, therefore you need to remove the "mapping": {...}
from your code, resulting in
es.indices.put_mapping(index='my_index, doc_type='_doc', body={
"properties": {
"pattern": {
"type": "keyword"
}
}
})