ElasticSearch:如何更新现有索引中的文档类型

ElasticSearch: How to update a document type in an existing index

长话短说:

我创建了一个严格的模板,创建了几个每日索引并将其中一种文档类型(%_level 类型从 float 更改为整数) 在模板中。

之后,我创建了其余的每日指数。

问题:

我需要更改文档类型(%_level 类型从 floatinteger ) 在旧索引中与新索引兼容。 我怎样才能做到这一点?

现在了解详情...

我有以下严格模板:

PUT _template/example-template
{
    "order":0,
    "version":200,
    "index_patterns":["example-*"],
    "settings":{
        "index":{
            "number_of_shards":4
         }
    },
    "mappings": {
        "iterations": {
            "dynamic":"strict",
            "properties": {
                "%_average1": {
                    "type":"float"
                },
                "%_average2": {
                    "type":"float"
                },
                "sum": {
                    "type":"integer"
                },
                "%_level": {
                    "type":"float"
                }
            }
        }
    }
}

使用此模板创建了多个索引。

一段时间后我意识到我们需要将 %_level 类型从 float 更改为 integer,所以我把模板改成了下面这样:

PUT _template/example-template
{
    "order":0,
    "version":200,
    "index_patterns":["example-*"],
    "settings":{
        "index":{
            "number_of_shards":4
         }
    },
    "mappings": {
        "iterations": {
            "dynamic":"strict",
            "properties": {
                "%_average1": {
                    "type":"float"
                },
                "%_average2": {
                    "type":"float"
                },
                "sum": {
                    "type":"integer"
                },
                "%_level": {
                    "type":"integer"
                }
            }
        }
    }
}

现在创建了以下索引,其中 %_level 类型是 integer

但旧索引包含 %_level 的索引,即 float,而新索引包含 %_level 是一个 整数 .

我需要将旧索引 %_levelfloat 转换为 integer 所以我可以构建包含所有索引的报告。

如何将旧索引中的 %_levelfloat 更改为 integer

虽然您可以通过提供文档 ID 在现有索引中添加和删除文档名称,但是如果您想更新文档类型并将其应用于所有索引文档,那么这样做是有问题的。

这个问题的一个很好的解决方案是重建索引。

Important:

The reindex process can convert some types implicitly (Numeric Type Casting) and the others explicitly.

In case you need implicit conversion, you can skip section 2

意思是,对所有旧索引应用以下内容(例如 example-20191220):

  1. example-20191220 创建一个名为 example-20191220-new
  2. 的新索引
  3. 在创建过程中添加一个无痛脚本,将 %_level 类型从 float 转换为 integer
  4. 删除旧索引example-20191220
  5. 重新索引 example-20191220-newexample-20191220

现在,'updated' 索引 example-20191220 具有正确的 %_level 类型。

第 2 部分 中的重建索引应如下所示:

(在 Kibana Dev Tools 上执行和测试)

POST _reindex
{
    "source": {
        "index": "example-20191220"
    },
    "dest": {
        "index": "example-20191220-new"
    },
    "script": {
    "lang": "painless", 
    "source": 
        """
        Double num = ctx._source['%_level'];
        if(num != null)
        { ctx._source['%_level'] = num.intValue(); }
        """
    }
}

第 4 节 中的重建索引应如下所示:

(在 Kibana Dev Tools 上执行和测试)

POST _reindex
{
    "source": {
        "index": "example-20191220-new"
    },
    "dest": {
        "index": "example-20191220"
    }
}