Elasticsearch中索引字段属性冲突及修复完整方案
创始人
2025-05-31 13:10:11
0

概要

由于历史原因,A产品数据入Es库中字段默认都是keyword并没有区分字段类型属性,随着业务发展,需要更多数据格式,原有的keyword满足不了新需求,所以问题来了,新老数据字段属性产生了冲突,如何安全高效解决这个问题是本文内容。
在这里插入图片描述

一、问题分析

通过报错信息可以确定,当聚合查询时有两个索引拥有两个不一样类型。
使用kibana进行查看两个索引mapping(出问题的mapping肯定是我新升级后产生索引mapping和升级前的对比),如下图所示发现两个索引mapping类型a、b字段都对应不上,keyword和long起了冲突,验证了报错信息,开始修复。
在这里插入图片描述

二、修复过程

1、方案设计

采用大数据数据迁移中比较常用的ABA的方式来实现,将A索引内容同步到B索引中(B修改后的mapping),删除A索引并新建A索引及mapping,将B索引中数据同步回到A索引中即可,注意重新建A索引mapping时一定要用正确的字段类型的mapping,否则就白同步了。
在这里插入图片描述

2、实际操作

2.1、评估数据同步时长

一般正常数据大概1G数据100w条左右,而es正常同步速度5000~6000条/秒,也就是说同步1G数据大概需要3分钟左右速度(不同数据大小、机器性能及Es设置会略有不同)。
执行如下命令来查看:GET cat/indices/test*
在这里插入图片描述

可以很轻松评估出索引同步时间大概需要多久,如果是生产环境这个很重要,因为你要以一个最优的速度实现同步同时还不能影响线上环境使用。

2.3、B索引及mapping的创建

因为我要修复test_01索引,还不能比当前索引大,索引我采用前面加0,那么就是创建test_001索引。
获取test_01索引的mapping,然后进行修改为正确类型。

  • 执行命令:GET test_01/_mapping
  • 修改获取后的mapping字段
  • 执行命令:POST test_001/message/_mapping {内容}
    在这里插入图片描述

注意:禁止创建比当前索引数字大情况索引,系统会进行增量索引时报异常!

2.4、数据同步【A->B】

将索引test_01同步到索引test_001,执行如下命令即可:

# copy index
POST _reindex?refresh&wait_for_completion=false
{"source": {"index": "test_01"},"dest": {"index": "test_001"}
}

执行后会返回一个计划id
在这里插入图片描述

执行如下命令进行查看计划状态:

GET _tasks/M3duzBS0TdW4Sae8gmla7g:20187723082

Total总数据,created当前同步条数
在这里插入图片描述

备注:当不记得这个计划id情况执行如下命令可获取:

GET _tasks?detailed=true&actions=*reindex

2.5、A索引重构及数据同步【B->A】

在确认test_001索引数据同步完成,没有问题情况下
删除test_01索引,执行命令:DELETE test_01
创建test_01索引,执行命令:PUT test_01
test_001的mapping创建新索引test_01的mapping
执行恢复同步索引

# copy index
POST _reindex?refresh&wait_for_completion=false
{"source": {"index": "test_001"},"dest": {"index": "test_01"}
}

2.6、同步速度的调整

由于现场环境复杂,所以说需要调整好相应速率及性能占用,避免影响正常生成使用。
通过如下命令来调整同步速度:其中红色为计划id,黄色为每秒条数

POST _reindex/M3duzBS0TdW4Sae8gmla7g:20187173464/_rethrottle?requests_per_second=1000

在这里插入图片描述

当你想结束计划时,执行如下命令即可:

POST _tasks/M3duzBS0TdW4Sae8gmla7g:20187723082/_cancel

最后,别忘记删除test_001索引,全部操作完成

三、总结

1、在实际项目中可以去发现,当索引机制如果是对后面数字01和1不进行区分情况是可以只同步一次的,A索引数据同步到B索引,通过一些业务数据修改,是可以直接用B索引的没有问题,这个当然也是需要去亲力亲为去验证。
2、其实本篇文章虽然是说的两个字段属性冲突问题,但实际生产中可不仅可以同步字段属性,甚至做一些文本内容转换、数据格式转换、字段替换等等,可玩性和可拓展性很大。

相关内容

热门资讯

Android开发-Andro... 01  Android UI 1.1  UI 用户界面(User Interface,...
基于springboot教师人... 基于springboot教师人事档案管理系统【源码+论文】 开发语言:Jav...
编写软件界面的方式 本文重点解决如下问题:编写软件的界面有哪几种方式?通常情形下࿰...
keil调试专题篇 调试的前提是需要连接调试器比如STLINK。 然后点击菜单或者快捷图标均可进入调试模式。 如果前面...
GO语言小锤硬磕十三、数组与切... 数组用来保存一组相同类型的数据,go语言数组也分一维数组和多维数组。 直接上代码看一下...
三级数据库备考--数据库应用系... 1.数据库应用系统设计包括概念设计、逻辑设计、物理设计3个步骤,每个步骤的设计活动按照...
prometheus数据持久化... https://segmentfault.com/a/1190000015710814 promet...
孩子用什么样的灯对眼睛没有伤害... 现代社会高速发展,越来越多的人开始重视身体健康,尤其是很多家长ÿ...
微软Bing GPT支持AI绘... 我想要一张图片:大象、珊瑚、火山、云朵我想要一张图片:亚特兰蒂斯...
最新!5月IPO受理数创今年新... IPO市场新动态。5月30日,共有4家IPO企业获得受理,其中创业板打破今年“0受理”现象,迎来首批...
Stable diffusio... Stable Diffusion是对Latent Diffusion模型的改进,主要在以下方面进行了...
Linux命令_lsof 网... 官方描述         一个打开的文件可以是一个常规文件、一个目录、一个块特殊文件、一个字符特殊...
树状数组(区间维护/单点修改) 1,定义 数组数组用于维护区间信息,简洁的几行的代码可以单点操作/区间查...
Junit4 + Mockit... ​ 实战代码案例: 1,引入依赖 org.spr...
Linux 增加用户 user... 在Linux中增加用户是用useradd指令指令基本选项useradd [option] usern...
2023年全国最新安全员精选真... 百分百题库提供安全员考试试题、建筑安全员考试预测题、建筑安全员ABC考试真题、安全员证考试题库等&#...
将 ChatGPT 与 实时聊... 人工智能技术是聊天营销人员的福音,而ChatGPT是这场革命的突破性新成员。人工智能工...
网络安全文章汇总导航(持续更新... 网络安全文章汇总导航(持续更新)1.基础篇(已完结...
8万字城市大脑综合运行管理平台... 本资料来源公开网络,仅供个人学习,请勿商用,如有侵权请联系...
SGCF:Simplifyin... 一、前言 1、摘要 传统模型在使用大型图上的非线性激活进行训练时面临困难。此外,由于图...