修改elasticsearch字段数据类型

在Elasticsearch中,字段数据类型无法直接更新,需要通过创建新索引并迁移数据来实现。具体步骤包括:创建新索引,复制旧索引数据,删除旧索引,再创建与旧索引名称相同的新索引,最后删除最初的临时索引。如果数据量大,此过程可能耗时较长。另外,也可在第四步后为新索引创建与旧索引相同的别名。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

以下操作基于elasticsearch版本:5.4 (elasticsearch最新版本7.x不适合)

说明:所有操作都在elasticsearch插件中进行。如果你没有插件,理会其精神,也是可以使用命令行操作的。

首先需明确一点:

elasticsearch中字段的数据类型无法做更新处理,这不像mysql中字段数据类型可以更新。

 

因此修改字段数据类型的思路是:

1、先新建一份新的索引A,新的索引A中,将需要修改的字段数据类型改为你需要更正的类型,其余字段与旧的索引B保持一致。

2、将旧索引B中数据复制到新索引A的数据中;

3、删除旧索引B数据;

4、再创建一个新索引C,C的要求是索引名称与B一致,字段数据类型与A一致;

5、将新索引A的数据复制到新索引C中;

6、删除新索引A数据。

7、此时得到的新索引C就是我们需要的。


1、首先查看字段的数据类型,是否真的错误。

在浏览器中输入地址,查看索引下字段的数据类型。
http://192.168.0.17:9201/article/_mapping

说明:
1、http://192.168.0.17:9201 数据查询ip
2、article 需要查询的索引名
3、_mapping 查询字段数据类型的命令

查询结果如下:
{
  "article": {     ------------------- index名称
    "mappings": {
      "info": {     ------------------ type名称
        "properties": {
          "createTime": {  ----------- 字段名称
            "type": "date"   --------- 数据类型
          },
          "data": {
            "type": "text",
            "fields": {
              "keyword": {
                "type": "keyword",
                "ignore_above": 256
              }
            }
          },
          "id": {
            "type": "text",
            "fields": {
              "keyword": {
                "type": "keyword",
                "ignore_above": 256
              }
            }
          },
          "type": {
            "type": "long"
          },
          "uid": {
            "type": "text",
            "fields": {
              "keyword": {
                "type": "keyword",
                "ignore_above": 256
              }
            }
          }
        }
      }
    }
  }
}

2、新建新索引A,修改自己需要的字段数据类型。此处为了演示,将type类型修改为tex

完整json:

{
  "article": {
    "mappings": {
      "info": {
        "properties": {
          "createTime": {
            "type": "date"
          },
          "data": {
            "type": "text",
            "fields": {
              "keyword": {
                "type": "keyword",
                "ignore_above": 256
              }
            }
          },
          "id": {
            "type": "text",
            "fields": {
              "keyword": {
                "type": "keyword",
                "ignore_above": 256
              }
            }
          },
          "type": {
            "type": "text",
            "fields": {
              "keyword": {
                "type": "keyword",
                "ignore_above": 256
              }
            }
          },
          "uid": {
            "type": "text",
            "fields": {
              "keyword": {
                "type": "keyword",
                "ignore_above": 256
              }
            }
          }
        }
      }
    }
  }
}

3、旧索引数据复制到新索引。

完整json:

{
  "source": {
    "index": "article"
  },
  "dest": {
    "index": "article_temp"
  }
}

4、删除旧索引数据

 

 

5、创建另一个新索引,该索引名称与旧索引相同,字段数据类型与上面新建索引相同。此处与第二步相同。

 

6、复制数据到新索引。此处与第三步相同。

 

7、删除第一个新建的索引。此处与第第四步相同。

 

8、至此就得到了你需要的。


我们可以看到在这个过程中,数据复制了两次,如果你的elasticsearch数据量比较大,则这个过程将会比较久。

 

还有一个别的处理方法,就是在第四步后,我们给新建的索引创建一个别名,别名和旧索引一致。

{
    "actions": [
        {"add": {"index": "article_temp", "alias": "article"}}
      ]
}

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值