背景:
數(shù)據(jù)庫:es
index: eventlist
type: event
原有的需求:用戶前端填入工單信息盖喷,其中有一個字段(工單號——workOrderNum)的類型在建庫時定義為long,在用戶前端輸入的時候也是數(shù)字類型的徽惋。同時有一個實體bean(后臺是Spring Boot)對應(yīng)著輸入的信息痢艺。
新的需求: 這個工單號不一定是數(shù)字仓洼,有可能是字符+數(shù)字的結(jié)構(gòu)。這樣導(dǎo)致在后臺在進(jìn)行實體映射時報錯——實體轉(zhuǎn)換錯誤堤舒。
解決辦法:
首先色建,es環(huán)境庫分為測試庫和線上庫,為了測試功能舌缤,測試庫和線上庫index的mapping保持一致(實際操作中箕戳,強(qiáng)烈建議先用測試庫操作,因為curl的時候很可能一不小心就操作錯誤)国撵。
思路:
1.改mapping字段類型
以前不知道es index的mapping在建好之后是不可以更改字段類型的陵吸,所以直接將mapping從long改為string(text)是行不通的。
2.重建mapping
這是網(wǎng)上大多推薦的方式介牙,重建新的index壮虫,然后建好全部字段的mapping,再把數(shù)據(jù)拷貝完成重新mapping环础。
但是我用的線上庫index里各種type都有囚似,牽扯的業(yè)務(wù)繁多,而我要改的只是其中的一個type线得,故不考慮這種方式饶唤。如果index的type少、數(shù)據(jù)量也不大框都,可使用這種方式搬素。
3.新建mapping字段
(1) 經(jīng)查找,雖然index的mapping在建好之后不可以更改字段類型魏保,但是可以添加新的字段熬尺,如下示例,給原index添加了一個字段類型為string的number屬性:
curl -X POST 'http://172.11.11.11:9200/indexName/typeName/_mapping?pretty' -d '{
"typeName": {
"properties": {
"number": {
"type": "string",
"index": "not_analyzed"
}
}
}
}'
(2) 新建字段后谓罗,原有程序里的實體bean也添加一個String number字段及其getter/setter方法粱哼。
(3) 為了不影響原有的bean映射以及不修改前端(前后端使用json),后端需要對接收到的數(shù)據(jù)進(jìn)行處理:
json.put("number",json.get("workOrderNum"));
json.put("workOrderNum",0l);
處理完之后進(jìn)行實體映射檩咱,這樣做能確保在做實體映射的時候不出錯揭措,存入es庫胯舷。