【问题标题】:ElasticSearch: How to update a document type in an existing indexElasticSearch:如何更新现有索引中的文档类型
【发布时间】:2020-04-18 12:31:33
【问题描述】:

长话短说:

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

之后,我创建了其余的每日索引。

问题:

我需要将旧索引中的文档类型(%_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":"float"
                }
            }
        }
    }
}

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

  • example-20191220
  • example-20191221
  • example-20191222
  • example-20191223

一段时间后我意识到我们需要将 %_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 类型是 整数

  • example-20192412
  • example-20192512
  • example-20192612

但旧索引包含 %_levelfloat 的索引,而新索引包含 %_level整数.

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

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

【问题讨论】:

    标签: elasticsearch indexing types updates


    【解决方案1】:

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

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

    重要:

    重新索引过程可以隐式转换某些类型 (Numeric Type Casting) 和显式转换其他类型。

    如果需要隐式转换,可以跳过第 2 节

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

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

    现在,“更新”索引 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"
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-02-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-16
      • 1970-01-01
      相关资源
      最近更新 更多