วิธีการเปลี่ยน Properties ของ Index ใน Elasticsearch แบบลูกทุ่ง

ปกติ Elasticsearch จะไม่ยอมให้เราเปลี่ยน Property ภายใน Index เนื่องจากจะทำให้ Structure ของข้อมูลที่ได้เก็บอยู่ก่อนนั้นได้รับผลกระทบแก้ไขง่ายที่สุดคือลบทั้ง index แล้วสร้างและ insert data เข้าไปใหม่ ก็เลยหาวิธีที่จะแก้ไขตรงส่วนนี้ สุดท้ายไปเจอกับวิธีนึงคือการ dump data จาก index ตัวนึงไปใส่ตัวนึงครับ

วิธีการคือ

  1. สร้าง 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 ใหม่ ได้ปกติแล้ว

ball Written by:

Teerapat Khunpech Live, Tech, Beers, Bike, Cafe Racer, Docker, Devops, Eco-System