以下操作基于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"}}
]
}