มาทำ Open Search ด้วย Golang กันเพื่อชีวิตที่ดีขึ้น
เกริ่นก่อนว่าผมมาเขียนบทความนี้เนื่องจากเจอปัญหาการค้นหาแบบหลายมิติในฐานข้อมูลที่มีขนาดใหญ่ตรงๆ ทำให้เครื่อง Server CPU ทำงานหนัก และไปกระทบกับข้อมูลลอื่นๆทำให้ระบบที่ดึงข้อมูลส่วนอื่นๆใช้งานไปด้วยไม่ได้ จะดีกว่าไหมเราจะแยกส่วนการทำหน้าที่เพื่อให้ระบบมีประสิทธิภาพ ที่ผมเลือกเป็น Open Search เพราะ AWS มี Services นี้ให้บริการอยู่แล้ว มาเริ่มดูกันเลยดีกว่า
OpenSearch คือ Full Text Search เป็น Open Source ที่พัฒนาขึ้นโดย AWS และชุมชน Open Source เพื่อให้เป็นระบบสำหรับการค้นหาและการวิเคราะห์ข้อมูลขนาดใหญ่โดยการแบ่งการทำงานเป็นหลายๆ Nodes ที่มีความสามารถสูงในการจัดเก็บ, ค้นหา, และวิเคราะห์ข้อมูลได้ในเวลาจริง
หลักการทำงานของ OpenSearch
การเก็บข้อมูล (Indexing):
- ข้อมูลที่เก็บใน OpenSearch จะถูกจัดเก็บในรูปแบบ Indexโดยจะถูกแบ่งเป็นชาร์ด และแต่ละชาร์ดสามารถมีการทำ Replica เพื่อป้องกันข้อผิดพลาดของข้อมูล และการกระจายการโหลด
- ข้อมูลที่ถูกเก็บในดัชนีจะถูกวิเคราะห์ และถูกจัดเก็บในรูปแบบที่สามารถค้นหาได้อย่างรวดเร็ว
การค้นหาข้อมูล (Searching):
- OpenSearch ใช้การค้นหาแบบ full-text search ซึ่งสามารถค้นหาข้อมูลที่มีคำค้นหาหรือประโยคค้นหาที่มีลักษณะซับซ้อนได้
- มีการใช้ query language ที่หลากหลาย เช่น match, term, bool, range เพื่อค้นหาข้อมูลตามเงื่อนไขต่างๆ
- OpenSearch ใช้ inverted index ซึ่งช่วยให้การค้นหาเป็นไปอย่างรวดเร็ว
การวิเคราะห์ข้อมูล (Analytics):
- OpenSearch มีความสามารถในการวิเคราะห์ข้อมูลโดยใช้ aggregation framework ที่สามารถคำนวณสถิติ, การรวมกลุ่ม, การนับ, และการสร้างฮีสโตแกรม
- สามารถสร้าง visualizations ของข้อมูลได้โดยใช้ OpenSearch Dashboards ซึ่งเป็นส่วนหนึ่งของโครงการ OpenSearch
การกระจายงาน (Distributed System):
- OpenSearch ถูกออกแบบมาให้สามารถทำงานแบบกระจายได้ ซึ่งหมายความว่าข้อมูลและการประมวลผลสามารถถูกแบ่งและกระจายไปยังหลายๆ โหนด (nodes) ในคลัสเตอร์
- มีการจัดการ replica shards เพื่อให้มั่นใจว่าข้อมูลยังคงสามารถเข้าถึงได้แม้จะมีบางโหนดเกิดข้อผิดพลาด
สิ่งที่ต้องเตรียม
- VSCode
- Docker
- Golang
- Postman
Docker Compose สำหรับสร้าง OpenSearch และ Dashboard เพื่อ Monitor และ Manage OpenSearch
go mod init openSearch
จากนั้นผมจะทำการสร้าง Project Golang
ส่วนนี้คือ Code Golang มาดูส่วนแรกกันก่อนดีกว่า
ขยายความนิดหน่อย
Query DSL ถูกออกแบบมาให้มีความยืดหยุ่นและสามารถใช้ในการสร้างคำค้นหาที่ซับซ้อนและเฉพาะเจาะจงได้ โดยใช้ JSON ในการนิยามโครงสร้างของคำค้นหา ซึ่งประกอบด้วยองค์ประกอบหลักๆ ดังนี้:
Query Types:
- match: ใช้ในการค้นหาข้อความที่ตรงกันกับคำค้นหา
- term: ใช้ในการค้นหาข้อมูลที่ตรงกันเป๊ะกับคำค้นหา
- range: ใช้ในการค้นหาข้อมูลที่อยู่ในช่วงของค่าที่กำหนด
- bool: ใช้ในการรวมคำค้นหาหลายๆ แบบเข้าด้วยกัน โดยสามารถใช้ must, should, และ must_notเพื่อกำหนดเงื่อนไข
Filters:
- ใช้ในการกรองข้อมูลตามเงื่อนไขที่กำหนด เช่น term, range, exists
สามารถดูเพิ่มเติมได้ ที่นี่
จบไปแล้วกับบทความสำหรับการทำ Open Search รับรองได้เลยว่าข้อมูลหลายล้าน Rows สามารถ Query ออกมาได้รวดเร็วทันใจแน่นอน หวังว่าจะเป็นบทความที่มีประโยชน์ไม่มากก็น้อยนะครับ