reindex
ใน Elasticsearch 2.3 มีความสามารถใหม่ที่น่าสนใจ
ก็คือ Re-index API (_reindex)
ทำหน้าที่ย้ายข้อมูลจาก index หนึ่งไปยังอีก index หนึ่ง
โดยปกติเราจะใช้เครื่องมืออื่น ๆ มาช่วย

ดังนั้นเรามาลองใช้งานกันดีกว่าว่า API ตัวนี้เป็นอย่างไร ?

ปล. การใช้งานควรคิดให้มาก ๆ เนื่องจากยังมีสถานะเป็น experiment นะ
สามารถเปลี่ยนแปลงได้ตลอดเวลา
แถมการเปลี่ยนแปลงนั้น ๆ ไม่สนับสนุนของเดิมด้วยนะ (Not backward compatible)

เริ่มด้วยปัญหาที่ผู้ใช้งาน Elasticsearch พบเจอกันมาก

คือ เมื่อทำการ indexing ข้อมูลเข้ามายัง Elasticsearch แล้ว
พบว่า mapping ของข้อมูลไม่ถูกต้อง

ยกตัวอย่างเช่น เมื่อนำข้อมูลมาแสดงใน Kibana
แล้วจะแจ้งเตือนดังรูป

es01

คำถามคือ เราจะต้องแก้ไขปัญหานี้อย่างไรดี ?
ตอบง่าย ๆ คือ ก็ทำการ re-indexing ไงล่ะ

คำถามต่อมาก็คือ แล้วทำอย่างไรกันดี ?
คำตอบง่าย ๆ คือ

  • ลบ index แล้วสร้างใหม่ไงล่ะ ?
  • ถ้ามีข้อมูลก็ต้องสร้าง index ใหม่ จากนั้นทำการย้ายข้อมูล
  • แน่นอนว่าต้องใช้งาน Alias index ด้วยเสมอ

ประเด็นสำคัญอยู่ที่ข้อ 2 คือ การย้ายข้อมูล
ซึ่งวิธีการย้ายข้อมูลก่อน Elasticsearch 2.3 นั้น
แนะนำให้ทำการ Re-indexing แบบ Batching ด้วยการใช้งาน Scroll และ Bulk API
หรืออาจจะใช้เครื่องมือช่วยย้ายข้อมูล เช่น Elasticsearch Dump

ตัวอย่าง script ของการ Re-index เป็นดังนี้

เมื่อ Elasticsearch 2.3 ถูกปล่อยออกมาก็มี  Re-indexing API

ดังนั้นมาดูกันว่าใช้งานกันอย่างไร ?

ขั้นตอนที่ 1 ทำการสร้าง index ใหม่ก่อน ชื่อว่า sample_new ซึ่งมี mapping ดังนี้

ขั้นตอนที่ 2 ทำการย้ายข้อมูลด้วย _reindex API ดังนี้

คำอธิบาย
ในการใช้งาน Re-index api ประกอบไปด้วย 2 ส่วนคือ

  1. source คือ index ต้นทาง
  2. dest คือ index ปลายทาง

เมื่อเสร็จสิ้นการทำงาน จะพบว่าข้อมูลถูก copy ไปยัง sample_new index ทั้งหมด
และลองเข้าไปดูใน Kibana
จะพบว่าคำเตือนจาก Kibana จะหายไปแล้ว
ง่ายไหมล่ะ ?

แถมยังสามารถกรองข้อมูลเฉพาะที่ต้องการได้ด้วยนะ
เช่นถ้าต้องการเอกสารที่มี tags = elasticsearch จำนวน 3 เอกสารเท่านั้น
แสดงตัวอย่างดังนี้

ตัวอย่างของ script ทั้งหมดอยุ่ที่ Github::Up1::Elasticsearch sample

สุกท้ายแล้ว

จะเห็นว่า เราสามารถย้ายข้อมูลใน Elasticsearch
ด้วย Elasticsearch เลย ไม่ต้องไปใช้เครื่องมือจากข้างนอกอีกต่อไปแล้ว
น่าจะทำให้ชีวิตดีขึ้นอีกมากนะครับ