Screen Shot 2559-03-27 at 3.04.46 PM
คำถามหนึ่งที่ได้ยินบ่อยมาก ๆ สำหรับการนำ Elasticsearch มาใช้งานนั่นก็คือ

จะทำการ migrate และ update ข้อมูลระหว่าง  Elasticseach กับ Database อย่างไรดี ?

โดย Database นั้นหมายถึง ที่จัดเก็บข้อมูลของระบบในปัจจุบัน
ตัวอย่างเช่น RDBMS, File system และ Memory เป็นต้น

มาดูกันว่ามีวิธีการใดบ้าง ?

ถ้าเป็น Elasticsearch ก่อนเวอร์ชั่น 2.0

จะมีสิ่งที่เรียกว่า River API ให้ใช้งาน
ซึ่งจะมี JDBC River ไว้สำหรับการดึงข้อมูลจาก Database มาจัดเก็บที่ Elasticsearch อย่างอัตโนมัติ
แต่ว่าตั้งแต่เวอร์ชั่น 2.0 ได้นำเอาความสามารถนี้ออกไป
ดังนั้นวิธีการนี้จึงไม่ขอแนะนำอีกต่อไป

ส่วนวิธีการที่ขอแนะนำคือ เขียนโปรแกรมเอาเองเลยดีกว่า !!

เนื่องจากการเขียนโปรแกรมเอง มันจะยืดหยุ่นกว่า
ตอบรับกับความต้องการที่เปลี่ยนแปลงอยู่ตลอดเวลามากกว่า
แต่ข้อเสียคือ ต้องเสียเวลามาเรียนรู้วิธีการเขียนโปรแกรมอีก
ซึ่งมันเป็นเรื่องปกติที่มีข้อดีก็ต้องมีข้อเสีย

รูปแบบการ update หรือ sync ข้อมูล
แสดงดังรูป

db-es

ก่อนที่จะลงมือเขียนโปรแกรมหรือเลือกเครื่องมือ มาดูรูปแบบของข้อมูลที่จะจัดเก็บก่อนไหม ?

เพื่อทำให้เข้าใจก่อนว่า ข้อมูลที่จะจัดเก็บเป็นอย่างไร
ซึ่งนำข้อมูลมาจากบทความ Four ways to index relational data in Elasticsearch

รูปแบบที่ 1
ข้อมูล 1 row จาก Database คือ 1 Document ใน Elasticsearch
เป็นวิธีที่ง่าย และ ตรงไปตรงมาสุด ๆ
แสดงดังรูป
product-01

รูปแบบที่ 2
ข้อมูลจำนวนมากกว่า 1 row จาก Database คือ 1 Document ใน Elasticsearch
แสดงดังรูป

product-02

ดังนั้นสิ่งที่ต้องทำก่อนนำข้อมูลเข้า Elasticsearch คือ
ต้องทำการ join ข้อมูลจาก 2 Table ก่อนเสมอ
แสดงดังรูป

product-03

จากนั้นในการจัดเก็บที่ Elasticsearch
ก็ให้เก็บลง field/property ในรูปแบบของ Array ได้เลย
เป็นรูปแบบหนึ่งของการ Denomalization นั่นเอง

รูปแบบที่ 3
ทำการจัดเก็บข้อมูลใน Elasticsearch แบบ Nested object
มาดูตัวอย่างเพื่อความเข้าใจมากขึ้น
เป็นข้อมูลจาก 2 table คือ products และ sizes
แสดงดังรูป

product-04

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

ส่วนข้อมูลจาก sizes มีโครงสร้างแบบ Nested object
หรือข้อมูล 1 product จะอยู่ใน 1 document เท่านั้น
แสดงดังรูป

product-05

ข้อควรจำ

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

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

คำแนะนำจาก Elasticsearch บอกว่าในการ update/sync นั้นให้ใช้ Bulk API
และเขียนเองเถอะ ไม่จำเป็นต้องไปเครื่องมือใด ๆ เลย
ซึ่งอ้างอิงมาจากบทความเรื่อง Keeping elasticsearch in sync