前言
我们在使用ES的时候,尤其是初学者,通常都会遇到一个问题,那就是文档字段的映射类型创建错误问题,但是ES上却不能像mysql一样直接去修改字段类型,这时便出现了这个棘手的问题,今天让我们用一种索引重建的方式来修改字段映射类型,本文使用的ES是5.6.3版本。
前提
使用索引重建并且不停机,需要有个前提,那就是你在使用索引时,都是使用索引别名而不是使用真正的索引名
,如果这点在你的程序上还没有做的话,那么请为其建立别名,好处很多,一旦当前索引出现了什么问题 不能及时恢复,你可以紧急切换到备用索引上而无需再重启服务、方便索引重建等等。
思路
说下我们索引重建的思路,假设我们现有索引名为:a_v1,代表索引a的第一个版本,其别名为索引:a,重建步骤如下:
第一步:创建索引a_v2(该索引的mapping需要与a_v1基本保持一致,除了你要修改的字段mapping)
第二步:把a_v1的数据导入a_v2索引中(ES中有现成的语句支持)
第三步:把a_v1别名删除并且同时为a_v2添加别名a(此时线上程序已经切换到a_v2数据源上了)
第四步:再次执行第二步骤,目的是增量同步a_v1中修改但没有同步到a_v2中的数据(因为你在做第二、三步的时候很可能线上的a_v1索引数据发生修改了)
举例说明
下面我们以商品的索引重建为例,来看下具体的语句要怎么写吧O(∩_∩)O~,假设现在已经有索引goods_v1别名为goods
1. 新建目标索引V2版本
curl -XPUT --header 'Accept: application/json' 'http://es.zhuma.com/goods_v2' -d '{
"mappings": {
"default": {
"dynamic": "false",
"properties