Quantcast
Channel: cc :: somkiat
Viewing all articles
Browse latest Browse all 1997

ทำความรู้จักกับ Reindex API ใน Elasticsearch 2.3 กัน

$
0
0

reindex

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 เป็นดังนี้ [gist id="d03e1ba2aad382cdd1f521a9a12f716c" file="old_way.sh"]

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

ดังนั้นมาดูกันว่าใช้งานกันอย่างไร ? ขั้นตอนที่ 1 ทำการสร้าง index ใหม่ก่อน ชื่อว่า sample_new ซึ่งมี mapping ดังนี้ [gist id="d03e1ba2aad382cdd1f521a9a12f716c" file="new_way_create_index.sh"] ขั้นตอนที่ 2 ทำการย้ายข้อมูลด้วย _reindex API ดังนี้ [gist id="d03e1ba2aad382cdd1f521a9a12f716c" file="new_way_reindexing.sh"] คำอธิบาย ในการใช้งาน Re-index api ประกอบไปด้วย 2 ส่วนคือ
  1. source คือ index ต้นทาง
  2. dest คือ index ปลายทาง
เมื่อเสร็จสิ้นการทำงาน จะพบว่าข้อมูลถูก copy ไปยัง sample_new index ทั้งหมด และลองเข้าไปดูใน Kibana จะพบว่าคำเตือนจาก Kibana จะหายไปแล้ว ง่ายไหมล่ะ ? แถมยังสามารถกรองข้อมูลเฉพาะที่ต้องการได้ด้วยนะ เช่นถ้าต้องการเอกสารที่มี tags = elasticsearch จำนวน 3 เอกสารเท่านั้น แสดงตัวอย่างดังนี้ [gist id="d03e1ba2aad382cdd1f521a9a12f716c" file="new_way_filter.sh"] ตัวอย่างของ script ทั้งหมดอยุ่ที่ Github::Up1::Elasticsearch sample

สุกท้ายแล้ว

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

Viewing all articles
Browse latest Browse all 1997

Trending Articles