มาทำ 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

จากนั้นก็ docker compose up -d ได้เลย
หลังจากเสร็จเช็คด้วย docker ps
จากนั้นไปที่ Browser : localhost:5601 และกดไปที่ Add Sample Data
ผมจะเลือกเป็น Sample eCommerce orders
จากนั้นไปที่ Menu Discover แล้วลอง Seach เล่นได้เลย
go mod init openSearch

จากนั้นผมจะทำการสร้าง Project Golang

ส่วนนี้คือ Code Golang มาดูส่วนแรกกันก่อนดีกว่า

ส่วนนี้เป็นการ Init และสร้าง Session สำหรับจัดการต่างๆใน OpenSearch
ส่วนนี้เป็นการ Query แบบ DSL

ขยายความนิดหน่อย
Query DSL ถูกออกแบบมาให้มีความยืดหยุ่นและสามารถใช้ในการสร้างคำค้นหาที่ซับซ้อนและเฉพาะเจาะจงได้ โดยใช้ JSON ในการนิยามโครงสร้างของคำค้นหา ซึ่งประกอบด้วยองค์ประกอบหลักๆ ดังนี้:

Query Types:

  • match: ใช้ในการค้นหาข้อความที่ตรงกันกับคำค้นหา
  • term: ใช้ในการค้นหาข้อมูลที่ตรงกันเป๊ะกับคำค้นหา
  • range: ใช้ในการค้นหาข้อมูลที่อยู่ในช่วงของค่าที่กำหนด
  • bool: ใช้ในการรวมคำค้นหาหลายๆ แบบเข้าด้วยกัน โดยสามารถใช้ must, should, และ must_notเพื่อกำหนดเงื่อนไข

Filters:

  • ใช้ในการกรองข้อมูลตามเงื่อนไขที่กำหนด เช่น term, range, exists

สามารถดูเพิ่มเติมได้ ที่นี่

ตอนเรา Add Data Ecommerce มันจะสร้าง INDEX ที่ชื่อว่า opensearch_dashboards_sample_data_ecommerce ให้มองว่ามันคือ Table หรือ Collections ก็ได้
จากนั้นผมจะมายิง Postman โดยยิงไปที่ Index : opensearch_dashboards_sample_data_ecommerce ,text : oil ก็จะได้ข้อมูลมาตามรูปเลย
จากนั้นมาที่ Menu Index Management
แล้วเลือก Indexs จากนั้นผมจะ Create IndexName ชื่อว่า test_data
ยิง API Insert One
ยิง API Insert Many
หลังจากนั้นให้ไปที่เมนู Dashboards Management -> Index Pattern -> create index pattern เพื่อที่จะได้เพื่อระบุ Index ที่ต้องการค้นหา
จากนั้นจะมี test_data ที่ Discover เราก็จะทำการ Search ได้แล้ว
จากนั้นทำการแก้ Code นิดหน่อยให้ตรงกับ Data ที่เราเอาเข้า ปรับเป็น eventType
จากนั้นผมจะมาทำการ Search indexName : test_data,text : hu ก็จะได้ data ออกมา

จบไปแล้วกับบทความสำหรับการทำ Open Search รับรองได้เลยว่าข้อมูลหลายล้าน Rows สามารถ Query ออกมาได้รวดเร็วทันใจแน่นอน หวังว่าจะเป็นบทความที่มีประโยชน์ไม่มากก็น้อยนะครับ

--

--

Responses (1)