คำถามหนึ่งที่ได้ยินบ่อยมาก ๆ สำหรับการนำ Elasticsearch มาใช้งานนั่นก็คือ
จะทำการ migrate และ update ข้อมูลระหว่าง Elasticseach กับ Database อย่างไรดี ?
โดย Database นั้นหมายถึง ที่จัดเก็บข้อมูลของระบบในปัจจุบัน
ตัวอย่างเช่น RDBMS, File system และ Memory เป็นต้น
มาดูกันว่ามีวิธีการใดบ้าง ?
ถ้าเป็น Elasticsearch ก่อนเวอร์ชั่น 2.0
จะมีสิ่งที่เรียกว่า
River API ให้ใช้งาน
ซึ่งจะมี JDBC River ไว้สำหรับการดึงข้อมูลจาก Database มาจัดเก็บที่ Elasticsearch อย่างอัตโนมัติ
แต่ว่าตั้งแต่เวอร์ชั่น 2.0 ได้นำเอาความสามารถนี้ออกไป
ดังนั้นวิธีการนี้จึงไม่ขอแนะนำอีกต่อไป
ส่วนวิธีการที่ขอแนะนำคือ เขียนโปรแกรมเอาเองเลยดีกว่า !!
เนื่องจากการเขียนโปรแกรมเอง มันจะยืดหยุ่นกว่า
ตอบรับกับความต้องการที่เปลี่ยนแปลงอยู่ตลอดเวลามากกว่า
แต่ข้อเสียคือ ต้องเสียเวลามาเรียนรู้วิธีการเขียนโปรแกรมอีก
ซึ่งมันเป็นเรื่องปกติที่มีข้อดีก็ต้องมีข้อเสีย
รูปแบบการ update หรือ sync ข้อมูล
แสดงดังรูป
ก่อนที่จะลงมือเขียนโปรแกรมหรือเลือกเครื่องมือ มาดูรูปแบบของข้อมูลที่จะจัดเก็บก่อนไหม ?
เพื่อทำให้เข้าใจก่อนว่า ข้อมูลที่จะจัดเก็บเป็นอย่างไร
ซึ่งนำข้อมูลมาจากบทความ
Four ways to index relational data in Elasticsearch
รูปแบบที่ 1
ข้อมูล 1 row จาก Database คือ 1 Document ใน Elasticsearch
เป็นวิธีที่ง่าย และ ตรงไปตรงมาสุด ๆ
แสดงดังรูป
รูปแบบที่ 2
ข้อมูลจำนวนมากกว่า 1 row จาก Database คือ 1 Document ใน Elasticsearch
แสดงดังรูป
ดังนั้นสิ่งที่ต้องทำก่อนนำข้อมูลเข้า Elasticsearch คือ
ต้องทำการ join ข้อมูลจาก 2 Table ก่อนเสมอ
แสดงดังรูป
จากนั้นในการจัดเก็บที่ Elasticsearch
ก็ให้เก็บลง field/property ในรูปแบบของ
Array ได้เลย
เป็นรูปแบบหนึ่งของการ Denomalization นั่นเอง
รูปแบบที่ 3
ทำการจัดเก็บข้อมูลใน Elasticsearch แบบ
Nested object
มาดูตัวอย่างเพื่อความเข้าใจมากขึ้น
เป็นข้อมูลจาก 2 table คือ products และ sizes
แสดงดังรูป
ก่อนที่จะจัดเก็บข้อมูลลงไปยัง Elasticsearch
ต้องทำการ join ข้อมูลกันก่อน
และเลือกเฉพาะ column ที่จำเป็นต่อการใช้งานเท่านั้น
ไม่ควรเก็บข้อมูลที่ไม่จำเป็นหรือไม่ได้ใช้งาน
ส่วนข้อมูลจาก sizes มีโครงสร้างแบบ Nested object
หรือข้อมูล 1 product จะอยู่ใน 1 document เท่านั้น
แสดงดังรูป
ข้อควรจำ
ก่อนจะเก็บข้อมูลลงใน Elasticsearch
ต้องคิดก่อนเสมอว่า ปัญหาคืออะไร และ จะแก้ไขอย่างไร
ไม่ใช่ตั้งหน้าตั้งตาเก็บกันอย่างเดียว !!
นั่นคือ เก็บเท่าที่จำเป็น เก็บเท่าที่ใช้
เรานำ Elasticsearch มาใช้เพื่อช่วย
ทำให้ระบบการค้นหามันสะดวกขึ้น
ทำให้ระบบการค้นหามันง่ายขึ้น
ทำให้ระบบการค้นหามันเร็วขึ้น
มิใช่นำมาแทนที่ Database หลักนะครับ
คำแนะนำจาก Elasticsearch บอกว่าในการ update/sync นั้นให้ใช้ Bulk API
และเขียนเองเถอะ ไม่จำเป็นต้องไปเครื่องมือใด ๆ เลย
ซึ่งอ้างอิงมาจากบทความเรื่อง
Keeping elasticsearch in sync