Behebung von ElasticSearch 'Root mapping definition has unsupported parameters'

English Deutsch

Problem:

Du möchtest einen ElasticSearch-Index mit einem Custom-Mapping erstellen oder das Mapping eines bestehenden ElasticSearch-Index aktualisieren, aber du siehst eine Fehlermeldung wie

elasticsearch-error.txt
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}}}]')

Lösung

Dies kann auf mehrere Probleme hindeuten. Im Wesentlichen versucht ElasticSearch dir mitzuteilen, dass die Struktur deines JSON nicht korrekt ist.

Oft wird dieser Fehler als einzelne Felddefinitionen seien falsch fehlinterpretiert, aber dies ist selten das Problem (und nur wenn eine einzelne Felddefinition komplett fehlerhaft ist).

Wenn deine Meldung so strukturiert ist wie

mapping-error.txt
... unsupported parameters:  [mappings : ...

dann ist die wahrscheinlichste Ursache, dass du mappings innerhalb von mappings in deinem JSON verschachtelt hast. Dies gilt auch, wenn du ein Mapping aktualisierst (put_mapping) - in diesem Fall ist das äußere mapping implizit!

Beispiel: Dein Code sieht so aus:

put_mapping_bad.py
es.indices.put_mapping(index='my_index, doc_type='_doc', body={
    "mappings": {
        "properties": {
            "pattern": {
                "type":  "keyword"
            }
        }
    }
})

ElasticSearch wird intern ein JSON wie dieses erstellen:

mapping.json
{
    "mappings": {
        "mappings": {
            "properties": {
                "pattern": {
                    "type":  "keyword"
                }
            }
        }
    }
}

Siehst du, dass es zwei mappings ineinander gibt? ElasticSearch betrachtet dies nicht als korrekt strukturiertes JSON, daher musst du das "mapping": {...} aus deinem Code entfernen, was zu

put_mapping_fixed.py
es.indices.put_mapping(index='my_index, doc_type='_doc', body={
    "properties": {
        "pattern": {
            "type":  "keyword"
        }
    }
})

Check out similar posts by category: Databases, ElasticSearch, Python