如何修复 ElasticSearch 'Root mapping definition has unsupported parameters'

问题:

你想创建具有自定义映射的 ElasticSearch 索引或更新现有 ElasticSearch 索引的映射,但你看到类似这样的错误消息

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}}}]')

解决方案

这可能指向多个问题。本质上,ElasticSearch 试图告诉你你的 JSON 结构不正确

此错误经常被误解为单个字段定义错误,但这很少是问题所在(只有在单个字段定义完全格式不正确时才会出现)。

如果你的消息结构为

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

那么最可能的根本原因是你的 JSON 中 mappings 嵌套在 mappings 内。这也适用于更新映射(put_mapping)- 在这种情况下外部的 mapping 是隐式的!

示例: 你的代码如下所示:

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

ElasticSearch 将在内部创建类似这样的 JSON:

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

看到有两个 mappings 相互嵌套吗?ElasticSearch 不认为这是正确结构的 JSON,因此你需要从代码中删除 "mapping": {...},结果为

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