> 文章列表 > ElasticSearch修改索引字段类型

ElasticSearch修改索引字段类型

ElasticSearch修改索引字段类型

一、Es报MapperParsingException异常

线上功能报错,一看日志是往es中添加数据报错,错误日志如下:

org.elasticsearch.index.mapper.MapperParsingException: failed to parse field [categoryId] of type [integer] in document with id '1628993540560302081'
...
Caused by: java.io.IOException: Numeric value (1621025777837514753) out of range of int

说是数据中有个字段类型转换错误,一查es脚本工具,果然生产es索引中categoryId这个字段是integer类型,而实际是long类型。

补充:es查询索引类型查询方法

get请求
http://地址/索引/类型/_mapping
无需参数

在这里插入图片描述

二、ES修改索引字段类型

1、方法简述

es不能直接修改索引字段类型,需要删除调新建,具体方法如下

1. 创建一个中间索引
2. 向中间索引备份源索引的数据(mapping)
3. 查询确认数据是否copy过去
4. 删除有问题的索引
5. 重新创建同名的索引(★字段类型修改正确★)
6. 从中间索引还原到源索引的数据
7. 删除中间索引

2、具体执行案例

我这次遇到问题的es索引中没有旧数据,所以只要把字段类型错的索引删除,然后新建同名索引(字段类型改正确)

1)删除旧索引

可以通过es脚本插件的删除按钮删除
在这里插入图片描述
也可以发请求删除

补充:es删除索引方法

delete请求
http://地址/索引

在这里插入图片描述

2)重新创建同名的索引(★字段类型修改正确★)

补充:es创建索引方法

需要 “新建索引”——>“添加mapping” 两步(我目前只知道这一种方法)。

第一步,先在脚本插件新建索引
在这里插入图片描述
第二步,为新建索引创建Mapping(即发设置字段参数的请求)
在这里插入图片描述
因为参数大部分与删除前的索引相同,只有个别地方需要修改;所以,我在删除旧索引之前,复制了mapping中的参数、做了一点修改,然后在设置新索引mapping这里粘贴上去即可。

3、因为我的旧索引中没有数据,所以可以直接删除、新增;下面介绍一下需要备份参数的具体方法(就是一种说的)

# 1. 创建一个中间索引
#创建索引
PUT demo_metric_1/# 创建Mapping
POST demo_metric_1/type/_mapping
{  "type": {"properties": {        "log_time_date": {"type": "date","format": "epoch_millis"},.....        }} 
}# 2. 向中间索引备份源索引的数据# 重建索引
POST _reindex
{"source": {"index": "demo_metric"},"dest": {"index": "demo_metric_1"}
}# 3.查询确认数据是否copy过去
GET /demo_metric/type/_searchGET /demo_metric_1/type/_search# 4.删除有问题的索引
# 删除有问题的索引
DELETE demo_metric# 5.重新创建同名的索引(★字段类型修改正确★)
#创建索引
PUT demo_metric/# 创建Mapping
POST demo_metric/type/_mapping
{  "type": {"properties": {        "log_time_date": {"type": "date","format": "epoch_millis"},.....        }} 
}# 6. 从中间索引还原到源索引的数据
# 重建索引
POST _reindex
{"source": {"index": "demo_metric_1"},"dest": {"index": "demo_metric"}
}# 7. 删除中间索引
DELETE demo_metric_1