es索引字段类型错误如何高效解决(如何修改es索引字段类型)

Posted yuec1998

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了es索引字段类型错误如何高效解决(如何修改es索引字段类型)相关的知识,希望对你有一定的参考价值。

今天因为上线之前,忘记提单先把es的索引新增的几个字段先建好,导致需求上线后,一些触发es推送数据的接口,使得es自动根据数据类型创建索引机制生效,原本我打算增加的mapping字段是数组keyword类型的,但是es自动匹配创建类型为long,导致索引作废,可是这个es索引24小时都有人在使用,如果粗暴删除重建索引,再全量同步数据,会导致一段时间国内外用户查询数据受影响,这个操作估计也会上传比较严重的故障等级,那有什么解决方法吗?–当然

如果你们系统没有使用es别名,那么暂时先按以下方式处理,后面提出了后续的优化方案。
1、先新建一个正确的索引,如下图(原索引feh-product-sit)

2、将旧索引数据同步到新的索引上

POST _reindex
{
  "source": {
    "index": "feh-product-sit"
  },
  "dest": {
    "index": "feh-product-sit-v1",
    "op_type": "create"
  }
}

此时,数据是批量同步的,可以通过以下命令查看同步情况

GET _tasks?detailed=true&actions=*reindex&human

当同步完成时,如下图

3、将旧索引删除

4、删除的之后马上,执行以下命令,给旧索引新增别名,此时新索引就代替了就索引的位置,这个过程要快,因为保不准此刻正在推数据,你就漏了几条生产数据了(事实上我们当时也是漏推了几条数据)

POST /_aliases
{
	"actions": [{
			"add": {
				"index": "feh-product-sit-v1",
				"alias": "feh-product-sit"
			}
		}
	]
}

建议的解决方案,在生产中,我们不要直接使用索引的正式索引名
我们建索引feh-product-sit-v1并给他配置一个别名feh-product-sit-alias,在代码配置文件中就使用 feh-product-sit-alias,去操作es,如果遇到这种情况,我们就直接新建一个索引feh-product-sit-v2,然后按照上面的方式重推数据后,将索引feh-product-sit-v1去除别名 feh-product-sit-alias的同时将feh-product-sit-v2别名为 feh-product-sit-alias,使用如下指令

POST /_aliases
{
	"actions": [{
			"add": {
				"index": "index-new",
				"alias": "index-alias"
			}
		},
		{
			"remove": {
				"index": "index-old",
				"alias": "index-alias"
			}
		}
	]
}

这样有个好处,就是我们如果在一些特殊情况需要在测试环境大规模测试操作一份数据只需要备份一份es数据,可以随意命名索引,然后切换别名,使用完之后删除,并切换回原es索引数据即可。在生产上,强烈推荐这样操作,毕竟吃一堑长一智,写完这篇博客就去把去搞了。

以上是关于es索引字段类型错误如何高效解决(如何修改es索引字段类型)的主要内容,如果未能解决你的问题,请参考以下文章

es修改索引字段类型

es修改索引时间格式

[Elasticsearch] ES修改字段类型

如何判断es mapping已经存在

es 修改 mapping 字段类型

ES 索引模板和动态模板