ปกติ Elasticsearch จะไม่ยอมให้เราเปลี่ยน Property ภายใน Index เนื่องจากจะทำให้ Structure ของข้อมูลที่ได้เก็บอยู่ก่อนนั้นได้รับผลกระทบแก้ไขง่ายที่สุดคือลบทั้ง index แล้วสร้างและ insert data เข้าไปใหม่ ก็เลยหาวิธีที่จะแก้ไขตรงส่วนนี้ สุดท้ายไปเจอกับวิธีนึงคือการ dump data จาก index ตัวนึงไปใส่ตัวนึงครับ
วิธีการคือ
- สร้าง index ตัวใหม่เอาไว้รอ พร้อมทั้งแก้ไข property ที่เราต้องการจะแก้ไข้
ตัวอย่างคือ index เดิมมีชื่อว่า mydata ที่ใช้งานอยู่มี property ดังนี้
{ "mappings": { "mytype": { "properties": { "@timestamp": { "type": "date", "format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis" }, "return_message": { "type": "string" }, "request_params": { "type": "string" }, "dest_response_message": { "type": "string" }, "start_time": { "type": "date", "format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis" } } } }
และเราต้องสร้าง index ใหม่ที่มีชื่อว่า mydata_v1 และมีการแก้ไข properties ให้เป็นรูปแบบนี้
curl -XPUT localhost:9200/mydata_v1 -d '
{
"mappings": {
"mytype": {
"properties": {
"@timestamp": {
"type": "date",
"format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis"
},
"return_message": {
"type": "string"
},
"request_params": {
"type": "string"
},
"dest_response_message": {
"type": "string"
},
"start_time": {
"type": "date",
"format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd HH:mm:ss.SSSSSS||yyyy-MM-dd||epoch_millis"
}
}
}
}
}
2. ใช้ elasticdump เพื่อ dump data จาก index เก่าและ import ใส่เข้าไปใน index ใหม่
ทำการติดตั้ง elasticdump จาก https://github.com/taskrabbit/elasticsearch-dump
npm install elasticdump
หลังจากนั้นทำการ dump data จาก index (mydata) ตัวเก่าเข้าไปไว้ใน index (mydata_v1) ตัวใหม่ ด้วยคำสั่ง
./node_modules/elasticdump/bin/elasticdump \ --input=http://localhost:9200/mydata \ --output=http://localhost:9200/mydata_v1 \ --type=data
หลังจากนั้นก็รอจนกว่าจะเสร็จ
3. ลบ index (mydata) ตัวเก่าทิ้งซะ
curl -XDELETE http://localhost:9200/mydata
4. ทำ Alias index ให้กับ index ตัวใหม่
curl -XPOST http://localhost:9200/_aliases -d ' { "actions": [ { "add": { "alias": "mydata", "index": "mydata_v1" }} ] } '
หลังจากนั้นเวลาเราเรียกใช้งานก็เรียกใช้งานเหมือนเดิมคือ
curl -XGET http://localhost:9200/mydata
แค่นี้ก็ใช้งานชื่อ index เดิม data เดิม แต่ properties ใหม่ ได้ปกติแล้ว