公司的一个项目用了elasticsearch,我接手这个项目的维护工作,中途发生了几次需求变更以及bug修复。在过程中,我发现几点不好的使用方式:
1.目前的存储,都是放在同一个index下的,然后不同业务分的不同的type存储。
2.存储数据之前,没有初始化操作,未对索引中字段进行类型设置。
为何提出以上两点建议:
公司项目使用的elasticserach版本:5.2.1
- 遇到了问题:
在一个type的数据中,我增加了一个字段,记录以逗号分隔的日期(具体为何存逗号分隔的日期此处不解释,业务需求),测试时候都没出问题,结果上uat环境出问题了,报错为“类型错误”。 - 开始解决问题:
使用rest方式查看一些设置:
查看index下的字段mapping
GET /index_name/_mapping/
查看index下指定type下的字段mapping
GET /index_name/_mapping/type_name
然后,发现新增的那个字符串字段竟然是date类型。
原因:初始值为一个日期,所以没有逗号分隔,于是默认指定为日期类型(真的没想让elasticsearch那么智能的)。
尝试修改字段的类型,发现改起来很麻烦,想删除这个type,发现不行,会报错:
No handler found for uri [/index_name/type_name] and method [DELETE]
现在5.X版本的elasticsearch已经不支持删除一个type了,只能从index上面删,但是index的数据很多,不能随便删,备份再恢复,很麻烦。
最后直接暴力解决,增加一个新字段,那个老字段直接作为垃圾字段扔在那里。
于是,给出建议:
1.根据业务,分不同index存储当前业务的数据,有变动的时候,做大动作不影响其他业务。
2.存储之前,第一次,做初始化,字段类型自己指定,否则有可能elasticsearch默认给的类型会不满足业务要求。