ในยุคดิจิทัลที่ข้อมูลหลั่งไหลเข้ามาอย่างมหาศาล ความสามารถในการค้นหาข้อมูลที่ถูกต้อง รวดเร็ว และแม่นยำ กลายเป็นหัวใจสำคัญที่ขับเคลื่อนทุกธุรกิจ ไม่ว่าจะเป็นเว็บไซต์ E-commerce, แพลตฟอร์มข่าวสาร, ระบบจัดการเอกสารภายในองค์กร หรือแม้แต่แอปพลิเคชันมือถือ การที่ผู้ใช้สามารถค้นหาสิ่งที่ต้องการได้อย่างง่ายดาย ไม่ใช่แค่การอำนวยความสะดวก แต่เป็นการสร้างประสบการณ์ที่เหนือกว่า และเป็นปัจจัยชี้ขาดความสำเร็จของธุรกิจในปัจจุบันเลยก็ว่าได้ครับ
แต่การค้นหาแบบเดิมๆ ที่พึ่งพาฐานข้อมูลเชิงสัมพันธ์ (RDBMS) หรือการค้นหาคำตรงตัว (Exact Match) มักไม่เพียงพอต่อความต้องการที่ซับซ้อนของผู้ใช้ในปัจจุบัน เราต้องการระบบที่ “เข้าใจ” บริบทของคำค้นหา สามารถจัดการกับการสะกดผิดเล็กน้อย ค้นหาคำพ้องความหมาย หรือแม้กระทั่งแนะนำคำค้นหาที่เกี่ยวข้องได้ และนี่คือจุดที่เทคโนโลยี Full-text Search อย่าง Elasticsearch เข้ามามีบทบาทสำคัญ ที่จะช่วยให้คุณสร้างระบบค้นหาอัจฉริยะ ที่ไม่เพียงแค่ “หาเจอ” แต่ยัง “เข้าใจ” สิ่งที่ผู้ใช้กำลังมองหาได้อย่างแท้จริงครับ
บทความนี้จะเจาะลึกถึงแก่นแท้ของ Elasticsearch ในฐานะเครื่องมือสำหรับการทำ Full-text Search ตั้งแต่หลักการพื้นฐาน สถาปัตยกรรม การติดตั้ง ไปจนถึงเทคนิคการค้นหาขั้นสูง การปรับแต่งประสิทธิภาพ และกรณีศึกษาที่น่าสนใจ เพื่อให้คุณได้เห็นภาพรวมและสามารถนำไปประยุกต์ใช้สร้างระบบค้นหาอัจฉริยะสำหรับธุรกิจของคุณได้อย่างมั่นใจครับ
- บทนำ: ทำไม Full-text Search ถึงสำคัญในยุคดิจิทัล?
- รู้จักกับ Elasticsearch: หัวใจของระบบค้นหาอัจฉริยะ
- หลักการทำงานของ Full-text Search ใน Elasticsearch
- เริ่มต้นใช้งาน Elasticsearch: การติดตั้งและพื้นฐาน
- การสร้าง Mapping ที่เหมาะสมสำหรับ Full-text Search
- เทคนิคการค้นหาขั้นสูงด้วย Elasticsearch
- การปรับแต่งประสิทธิภาพและการ Scaling
- เปรียบเทียบ Elasticsearch กับระบบค้นหาแบบดั้งเดิม
- กรณีศึกษาและการประยุกต์ใช้ Elasticsearch ในธุรกิจ
- คำถามที่พบบ่อย (FAQ)
- สรุปและอนาคตของระบบค้นหาอัจฉริยะ
- เริ่มต้นสร้างระบบค้นหาของคุณกับ SiamLancard.com
บทนำ: ทำไม Full-text Search ถึงสำคัญในยุคดิจิทัล?
ในโลกที่ขับเคลื่อนด้วยข้อมูล (Data-driven World) ปริมาณข้อมูลดิจิทัลเพิ่มขึ้นอย่างก้าวกระโดดทุกวัน ไม่ว่าจะเป็นบทความ, สินค้า, รีวิว, เอกสาร, หรือแม้แต่ข้อความสนทนา การเข้าถึงข้อมูลเหล่านี้ได้อย่างมีประสิทธิภาพ จึงไม่ใช่แค่ความสะดวกสบาย แต่เป็นสิ่งจำเป็นที่ขาดไม่ได้เลยครับ
ปัญหาของการค้นหาแบบเดิม
ระบบค้นหาแบบดั้งเดิมที่ใช้ฐานข้อมูลเชิงสัมพันธ์ (RDBMS) เช่น MySQL, PostgreSQL มักจะพึ่งพาการค้นหาแบบ LIKE %keyword% ซึ่งมีข้อจำกัดหลายประการครับ
- ประสิทธิภาพต่ำ: เมื่อข้อมูลมีขนาดใหญ่ การค้นหาแบบ
LIKEจะใช้เวลานานมาก เพราะต้องสแกนทุกแถวในตาราง - ความแม่นยำต่ำ: ค้นหาได้เฉพาะคำตรงตัวเท่านั้น ไม่เข้าใจบริบท ไม่รองรับการสะกดผิดเล็กน้อย หรือคำพ้องความหมาย
- ไม่รองรับภาษาไทย: ภาษาไทยเป็นภาษาที่ไม่มีการเว้นวรรคระหว่างคำ ทำให้การค้นหาคำย่อยๆ ทำได้ยากและไม่แม่นยำ
- ไม่มีการจัดอันดับ (Relevance Scoring): ผลลัพธ์ที่ได้ไม่มีการเรียงลำดับตามความเกี่ยวข้อง ทำให้ผู้ใช้ต้องเลื่อนหาเอง
- ไม่มีฟีเจอร์ขั้นสูง: ขาดความสามารถในการทำ Autocomplete, Suggestion, Faceted Search (การกรองตามคุณสมบัติ), หรือ Highlight คำที่ค้นหา
ด้วยข้อจำกัดเหล่านี้ การพึ่งพาระบบค้นหาแบบเดิมจึงไม่สามารถตอบสนองความคาดหวังของผู้ใช้ในปัจจุบันได้อีกต่อไป ผู้ใช้ต้องการระบบที่ฉลาดกว่า เข้าใจภาษาธรรมชาติ และนำเสนอผลลัพธ์ที่ตรงใจที่สุดครับ
ความต้องการระบบค้นหาที่ “เข้าใจ” ผู้ใช้
ระบบค้นหาอัจฉริยะ (Intelligent Search System) คือระบบที่สามารถทำอะไรได้มากกว่าการค้นหาคำตรงตัวครับ มันคือระบบที่:
- เข้าใจบริบท: สามารถวิเคราะห์ข้อความและเข้าใจความหมายของคำค้นหาได้
- รองรับการสะกดผิด (Typo Tolerance): แม้จะพิมพ์ผิดเล็กน้อย ก็ยังสามารถค้นหาคำที่ใกล้เคียงได้
- ค้นหาคำพ้องความหมาย (Synonym Search): ค้นหาคำที่มีความหมายเดียวกันได้
- จัดอันดับความเกี่ยวข้อง (Relevance Ranking): แสดงผลลัพธ์ที่เกี่ยวข้องที่สุดขึ้นมาก่อน
- นำเสนอคำแนะนำ (Suggestion & Autocomplete): ช่วยให้ผู้ใช้ค้นหาได้เร็วขึ้นและแม่นยำขึ้น
- รองรับภาษาซับซ้อน: สามารถจัดการกับภาษาไทยหรือภาษาอื่นๆ ที่มีโครงสร้างเฉพาะได้
- ปรับขนาดได้ (Scalability): รองรับข้อมูลปริมาณมหาศาลและการค้นหาพร้อมกันจำนวนมาก
และนี่คือจุดที่ Elasticsearch เข้ามาเติมเต็มช่องว่างนี้ได้อย่างสมบูรณ์แบบ ด้วยสถาปัตยกรรมที่ออกแบบมาเพื่อการค้นหาข้อความเต็มรูปแบบโดยเฉพาะ ทำให้มันเป็นเครื่องมือที่ทรงพลังสำหรับการสร้างระบบค้นหาอัจฉริยะในทุกรูปแบบครับ
รู้จักกับ Elasticsearch: หัวใจของระบบค้นหาอัจฉริยะ
เมื่อพูดถึง Full-text Search และระบบค้นหาอัจฉริยะ ชื่อแรกๆ ที่จะผุดขึ้นมาในใจนักพัฒนาและองค์กรต่างๆ ทั่วโลกก็คือ Elasticsearch ครับ ลองมาดูกันว่ามันคืออะไรและมีจุดเด่นอย่างไรบ้าง
Elasticsearch คืออะไร?
Elasticsearch คือ Search Engine แบบกระจายศูนย์ (Distributed Search Engine) และเครื่องมือวิเคราะห์ข้อมูลแบบเรียลไทม์ (Real-time Analytics Engine) ที่ถูกสร้างขึ้นบน Apache Lucene ครับ มันถูกออกแบบมาเพื่อเก็บ จัดการ และค้นหาข้อมูลประเภท Full-text ได้อย่างรวดเร็วและมีประสิทธิภาพสูง
จุดเด่นที่สำคัญคือ Elasticsearch เป็น NoSQL Database ประเภท Document-oriented ที่เก็บข้อมูลในรูปแบบ JSON ซึ่งง่ายต่อการจัดการและใช้งานร่วมกับแอปพลิเคชันต่างๆ นอกจากนี้ยังมีความสามารถในการทำ Full-text Search ที่โดดเด่น การวิเคราะห์ข้อมูลแบบ Aggregation และความสามารถในการขยายขนาด (Scalability) ได้อย่างง่ายดาย ทำให้มันเป็นหัวใจสำคัญของ Elastic Stack (ELK Stack) ซึ่งประกอบด้วย Elasticsearch, Kibana, Logstash และ Beats ครับ
คุณสมบัติเด่นของ Elasticsearch
Elasticsearch มีคุณสมบัติมากมายที่ทำให้มันเป็นตัวเลือกอันดับต้นๆ สำหรับงาน Full-text Search และการวิเคราะห์ข้อมูลครับ
- Full-text Search: ความสามารถในการค้นหาข้อความเต็มรูปแบบที่เหนือกว่าฐานข้อมูลทั่วไป รองรับการค้นหาที่ซับซ้อน เช่น การค้นหาวลี, การค้นหาแบบ Fuzzy, Synonym, Autocomplete เป็นต้น
- Distributed & Scalable: ถูกออกแบบมาให้ทำงานแบบกระจายศูนย์ตั้งแต่แรก ทำให้สามารถขยายขนาด (Scale out) ได้อย่างง่ายดายด้วยการเพิ่ม Node เข้าไปใน Cluster สามารถรองรับข้อมูลปริมาณมหาศาลและการค้นหาพร้อมกันจำนวนมากได้อย่างมีประสิทธิภาพ
- High Availability: ด้วยกลไก Shard และ Replica ทำให้ข้อมูลถูกจัดเก็บแบบซ้ำซ้อนกัน หาก Node ใด Node หนึ่งล้มเหลว ระบบก็ยังคงทำงานต่อไปได้โดยไม่หยุดชะงัก
- Real-time Analytics: สามารถค้นหาและวิเคราะห์ข้อมูลได้แบบเรียลไทม์ เหมาะสำหรับงาน Dashboards, Monitoring หรือการวิเคราะห์ Log
- RESTful API: มี API ที่ใช้งานง่ายผ่าน HTTP ในรูปแบบ JSON ทำให้การพัฒนาและเชื่อมต่อกับแอปพลิเคชันต่างๆ ทำได้อย่างรวดเร็ว
- Schema-less (Dynamic Mapping): ไม่จำเป็นต้องกำหนด Schema อย่างเข้มงวดล่วงหน้า Elasticsearch สามารถพยายามเดาประเภทข้อมูล (Field Type) ได้เอง แต่ก็ยังสามารถกำหนด Mapping เองได้เพื่อการควบคุมที่ละเอียดขึ้น
- Ecosystem (Elastic Stack): ทำงานร่วมกับเครื่องมืออื่นๆ ใน Elastic Stack ได้อย่างลงตัว เช่น Kibana สำหรับ Visualization และ Management, Logstash สำหรับ Data Ingestion, และ Beats สำหรับ Data Shipping
คุณสมบัติเหล่านี้ทำให้ Elasticsearch ไม่ใช่แค่เครื่องมือค้นหา แต่เป็นแพลตฟอร์มที่ครบวงจรสำหรับการจัดการและวิเคราะห์ข้อมูลขนาดใหญ่ได้อย่างมีประสิทธิภาพครับ
สถาปัตยกรรมพื้นฐานของ Elasticsearch (Node, Cluster, Shard, Replica)
การทำความเข้าใจสถาปัตยกรรมของ Elasticsearch เป็นสิ่งสำคัญในการออกแบบและปรับแต่งระบบครับ
- Cluster: คือกลุ่มของ Node ตั้งแต่หนึ่ง Node ขึ้นไปที่ทำงานร่วมกันเพื่อเก็บและค้นหาข้อมูลทั้งหมดในระบบ คลัสเตอร์จะมีชื่อเฉพาะ (Cluster Name) เพื่อให้ Node ต่างๆ รู้จักกันครับ
- Node: คือ Server หนึ่งเครื่องที่รัน Elasticsearch Instance Nodes ใน Cluster จะทำงานร่วมกันและเก็บข้อมูลบางส่วนของ Cluster ไว้ การเพิ่ม Node จะช่วยเพิ่มความจุและประสิทธิภาพให้กับ Cluster ได้ครับ
- Index: คล้ายกับ Database ใน RDBMS หรือ Collection ใน NoSQL Document-oriented Database Index เป็นที่เก็บ Document ที่มีโครงสร้างคล้ายกัน เช่น Index สำหรับสินค้า, Index สำหรับบทความ ข้อมูลที่ถูกเก็บใน Index จะถูกแบ่งออกเป็น Shard ครับ
- Document: คือหน่วยข้อมูลพื้นฐานที่ถูกเก็บใน Elasticsearch คล้ายกับ Row ใน RDBMS หรือเอกสารใน NoSQL Document-oriented Database Document จะถูกจัดเก็บในรูปแบบ JSON ที่มี Field ต่างๆ และมี Unique ID ครับ
-
Shard: คือหน่วยย่อยของ Index แต่ละ Index จะถูกแบ่งออกเป็น Shard ตั้งแต่หนึ่ง Shard ขึ้นไป การแบ่งข้อมูลเป็น Shard ทำให้ Elasticsearch สามารถกระจายข้อมูลไปยัง Node ต่างๆ ใน Cluster ได้ ทำให้สามารถค้นหาแบบขนาน (Parallel Search) และขยายขนาดได้ Shard มีสองประเภทหลักๆ คือ
- Primary Shard: คือ Shard หลักที่เก็บข้อมูลต้นฉบับ
- Replica Shard: คือ Shard สำเนาของ Primary Shard มีหน้าที่เพิ่มความทนทานต่อความผิดพลาด (Fault Tolerance) และช่วยเพิ่มประสิทธิภาพในการอ่าน (Read Performance) โดยการกระจายภาระการค้นหาครับ
โครงสร้างแบบกระจายศูนย์นี้เองที่ทำให้ Elasticsearch มีความยืดหยุ่น ประสิทธิภาพสูง และสามารถรองรับการเติบโตของข้อมูลได้อย่างไร้ขีดจำกัดครับ
หลักการทำงานของ Full-text Search ใน Elasticsearch
หัวใจสำคัญที่ทำให้ Elasticsearch ทำ Full-text Search ได้อย่างรวดเร็วและชาญฉลาดคือหลักการทำงานเบื้องหลังที่ซับซ้อนแต่มีประสิทธิภาพ ลองมาดูกันว่ามันทำงานอย่างไรครับ
Inverted Index: หัวใจของความเร็ว
แตกต่างจากฐานข้อมูลทั่วไปที่เก็บข้อมูลและค้นหาทีละแถว Elasticsearch ใช้โครงสร้างข้อมูลที่เรียกว่า Inverted Index (ดัชนีผกผัน) นี่คือหัวใจสำคัญที่ทำให้การค้นหา Full-text รวดเร็วปานสายฟ้าแลบครับ
Inverted Index เปรียบเสมือนดัชนีท้ายเล่มหนังสือที่เราคุ้นเคยกันดี แต่แทนที่จะบอกว่า “คำนี้อยู่หน้าไหนบ้าง” มันจะบอกว่า “คำนี้ปรากฏอยู่ในเอกสารใดบ้าง และอยู่ในตำแหน่งใดบ้าง” ครับ
เมื่อคุณเพิ่ม Document เข้าไปใน Elasticsearch ข้อความใน Document จะถูกประมวลผลผ่านกระบวนการที่เรียกว่า “Text Analysis” เพื่อแยกออกเป็นคำๆ (Tokens) จากนั้นแต่ละ Token จะถูกบันทึกลงใน Inverted Index พร้อมกับ ID ของ Document ที่ปรากฏอยู่ และข้อมูลอื่นๆ เช่น ตำแหน่ง (Position) ของคำใน Document หรือความถี่ (Frequency) ของคำนั้นๆ
ตัวอย่าง:
หากมีเอกสาร 2 ฉบับดังนี้:
- Document 1: “Elasticsearch is a powerful search engine.”
- Document 2: “Learn about Elasticsearch and its features.”
Inverted Index อาจจะมีลักษณะคร่าวๆ ดังนี้:
Term | Document IDs
------------|-------------------
Elasticsearch | 1, 2
is | 1, 2
a | 1
powerful | 1
search | 1
engine | 1
Learn | 2
about | 2
and | 2
its | 2
features | 2
เมื่อมีการค้นหาคำว่า “Elasticsearch” ระบบจะสามารถค้นหา Document ID ที่เกี่ยวข้องได้อย่างรวดเร็วโดยตรงจาก Inverted Index โดยไม่ต้องสแกนทุก Document ครับ
การวิเคราะห์ข้อความ (Text Analysis): Analyzer, Tokenizer, Token Filter, Character Filter
ก่อนที่ข้อความจะถูกนำไปสร้าง Inverted Index มันจะต้องผ่านกระบวนการวิเคราะห์ข้อความ (Text Analysis) ก่อนครับ กระบวนการนี้ช่วยเตรียมข้อความให้พร้อมสำหรับการค้นหา เพื่อให้ได้ผลลัพธ์ที่แม่นยำและเกี่ยวข้องมากขึ้น โดยมีส่วนประกอบหลักๆ ดังนี้
- Character Filter: ทำหน้าที่ประมวลผลข้อความดิบ (Raw Text) ก่อน Tokenizer เช่น การลบแท็ก HTML, การแปลงอักขระพิเศษ หรือการแทนที่คำบางคำ
-
Tokenizer: ทำหน้าที่แบ่งข้อความออกเป็นคำๆ (Tokens) หรือ “term” ตัวอย่างเช่น
Standard Tokenizerจะแบ่งตามช่องว่างและเครื่องหมายวรรคตอน ในขณะที่Thai Tokenizerจะมีความซับซ้อนกว่าเพราะต้องแบ่งคำในภาษาไทยที่ไม่มีการเว้นวรรค -
Token Filter: ทำหน้าที่ปรับเปลี่ยนหรือลบ Tokens ที่ได้จาก Tokenizer เช่น
Lowercase Token Filter: แปลงตัวอักษรให้เป็นตัวพิมพ์เล็กทั้งหมด เพื่อให้การค้นหาไม่คำนึงถึง Case SensitivityStop Word Token Filter: ลบคำทั่วๆ ไปที่ไม่มีความหมายในการค้นหา เช่น “a”, “the”, “is”, “ครับ”, “ค่ะ”Synonym Token Filter: แทนที่คำด้วยคำพ้องความหมาย เพื่อให้ค้นหาได้กว้างขึ้นStemming Token Filter: ลดรูปคำให้เป็นรูปพื้นฐาน (เช่น “running” เป็น “run”)
-
Analyzer: คือชุดของ Character Filter, Tokenizer และ Token Filter ที่ทำงานร่วมกัน โดย Analyzer จะถูกนำไปใช้กับ Field ที่เป็น
texttype ทั้งในระหว่างการ Indexing (เพื่อสร้าง Inverted Index) และระหว่างการ Query (เพื่อประมวลผลคำค้นหา)
ตัวอย่าง: Standard Analyzer, Thai Analyzer
- Standard Analyzer: เป็น Analyzer เริ่มต้นของ Elasticsearch เหมาะสำหรับภาษาอังกฤษและภาษาที่มีการเว้นวรรคชัดเจน มันจะแบ่งคำตามช่องว่าง, แปลงเป็นตัวพิมพ์เล็ก, และลบ Stop Words บางคำ
-
Thai Analyzer: สำหรับภาษาไทย ซึ่งไม่มีการเว้นวรรคระหว่างคำ จำเป็นต้องใช้ Thai Analyzer ที่มีความสามารถในการตัดคำ (Word Segmentation) ภาษาไทยได้ ซึ่งอาจจะต้องติดตั้ง Plugin เพิ่มเติม เช่น
thai-analyzerหรือicu-analyzerเพื่อให้การค้นหาภาษาไทยมีประสิทธิภาพสูงสุดครับ
กระบวนการ Text Analysis ที่เหมาะสมมีความสำคัญอย่างยิ่งต่อความแม่นยำและประสิทธิภาพของระบบค้นหาครับ
Relevance Scoring: การจัดอันดับผลลัพธ์
เมื่อผู้ใช้ค้นหา Elasticsearch จะไม่เพียงแค่หา Document ที่มีคำค้นหาเท่านั้น แต่ยังจัดอันดับความเกี่ยวข้อง (Relevance Scoring) ของแต่ละ Document ด้วย โดยให้คะแนน (Score) แก่ Document ที่เกี่ยวข้องมากที่สุด เพื่อแสดงผลลัพธ์ที่ตรงใจผู้ใช้มากที่สุดขึ้นมาก่อน
อัลกอริทึมที่ใช้ในการคำนวณคะแนนมีหลากหลาย แต่ที่นิยมใช้คือ TF/IDF และ BM25
TF/IDF, BM25
-
TF/IDF (Term Frequency-Inverse Document Frequency): เป็นอัลกอริทึมคลาสสิกที่ใช้ในการคำนวณความเกี่ยวข้อง
- Term Frequency (TF): ความถี่ของคำค้นหาที่ปรากฏใน Document ยิ่งคำปรากฏบ่อยใน Document นั้นๆ มากเท่าไหร่ Document นั้นก็ยิ่งมีความเกี่ยวข้องมากขึ้นเท่านั้น
- Inverse Document Frequency (IDF): ความหายากของคำใน Index ยิ่งคำนั้นหายากใน Index มากเท่าไหร่ (ปรากฏใน Document น้อย) คำนั้นก็ยิ่งมีความสำคัญมากขึ้นเท่านั้น
หลักการคือ คำที่ปรากฏบ่อยใน Document (สูง TF) แต่ไม่ค่อยปรากฏใน Document อื่นๆ ใน Index (สูง IDF) จะได้รับคะแนนความเกี่ยวข้องสูงครับ
- BM25 (Best Matching 25): เป็นอัลกอริทึมที่พัฒนาต่อยอดมาจาก TF/IDF และเป็นค่าเริ่มต้น (Default) ของ Elasticsearch ในเวอร์ชันหลังๆ BM25 มีการปรับปรุงเพื่อให้มีความแม่นยำมากขึ้น โดยคำนึงถึงปัจจัยอื่นๆ เช่น ความยาวของ Document เพื่อลดผลกระทบของ Document ที่ยาวเป็นพิเศษ BM25 มักจะให้ผลลัพธ์ที่ดีกว่า TF/IDF ในหลายๆ กรณีครับ
การทำความเข้าใจหลักการเหล่านี้จะช่วยให้เราสามารถปรับแต่ง Analyzer, Mapping และ Query เพื่อให้ได้ผลลัพธ์การค้นหาที่ตรงใจผู้ใช้มากที่สุดครับ
เริ่มต้นใช้งาน Elasticsearch: การติดตั้งและพื้นฐาน
เพื่อที่จะเริ่มสร้างระบบค้นหาอัจฉริยะ เราต้องติดตั้ง Elasticsearch และ Kibana ก่อนครับ สำหรับบทความนี้ เราจะเน้นที่การติดตั้งผ่าน Docker ซึ่งเป็นวิธีที่ง่ายและรวดเร็ว
การติดตั้ง Elasticsearch และ Kibana
ก่อนอื่น ตรวจสอบให้แน่ใจว่าคุณได้ติดตั้ง Docker และ Docker Compose บนเครื่องของคุณแล้วครับ จากนั้นสร้างไฟล์ docker-compose.yml ดังนี้:
version: '3.8'
services:
elasticsearch:
image: docker.elastic.co/elasticsearch/elasticsearch:8.13.2
container_name: elasticsearch
environment:
- xpack.security.enabled=false
- discovery.type=single-node
- ES_JAVA_OPTS=-Xms512m -Xmx512m # ปรับขนาด Heap Memory ตามความเหมาะสม
ulimits:
memlock:
soft: -1
hard: -1
volumes:
- esdata:/usr/share/elasticsearch/data
ports:
- 9200:9200
- 9300:9300
networks:
- elastic-network
kibana:
image: docker.elastic.co/kibana/kibana:8.13.2
container_name: kibana
environment:
- ELASTICSEARCH_HOSTS=http://elasticsearch:9200
ports:
- 5601:5601
networks:
- elastic-network
depends_on:
- elasticsearch
volumes:
esdata:
driver: local
networks:
elastic-network:
driver: bridge
บันทึกไฟล์นี้เป็น docker-compose.yml ในโฟลเดอร์ที่คุณต้องการ จากนั้นเปิด Terminal หรือ Command Prompt ในโฟลเดอร์นั้น แล้วรันคำสั่ง:
docker-compose up -d
รอสักครู่จนกระทั่ง Container ทั้งสองทำงานเสร็จ คุณสามารถตรวจสอบสถานะได้ด้วย docker-compose ps
เมื่อทุกอย่างพร้อม:
- Elasticsearch จะรันอยู่ที่ http://localhost:9200
- Kibana จะรันอยู่ที่ http://localhost:5601
คุณสามารถเข้าถึง Kibana เพื่อใช้เป็นหน้า UI ในการจัดการและตรวจสอบ Elasticsearch ได้ครับ
คำสั่งพื้นฐาน: Health Check, Indexing, Retrieving
เราจะใช้ cURL เพื่อส่งคำสั่งไปยัง Elasticsearch ครับ
Health Check: ตรวจสอบสถานะ Cluster
คุณสามารถตรวจสอบสถานะของ Cluster ได้โดยการเรียก API _cat/health
curl -X GET "localhost:9200/_cat/health?v"
ผลลัพธ์ที่ได้ควรจะแสดงสถานะเป็น green หรือ yellow (ถ้ามีแค่ Node เดียว)
ตัวอย่าง Code: Indexing Document (เพิ่มข้อมูล)
การเพิ่มข้อมูลเข้าไปใน Elasticsearch เรียกว่า “Indexing” เราจะเพิ่ม Document เข้าไปใน Index ที่ชื่อว่า products ครับ
# เพิ่มสินค้าชิ้นแรก
curl -X POST "localhost:9200/products/_doc/1?pretty" -H 'Content-Type: application/json' -d'
{
"name": "โน้ตบุ๊กประสิทธิภาพสูงสำหรับการทำงาน",
"description": "โน้ตบุ๊กบางเบา ทรงพลัง เหมาะสำหรับนักพัฒนาและนักออกแบบกราฟิก",
"price": 35000,
"category": "Electronics",
"tags": ["notebook", "laptop", "work", "developer", "graphic design"]
}
'
# เพิ่มสินค้าชิ้นที่สอง
curl -X POST "localhost:9200/products/_doc/2?pretty" -H 'Content-Type: application/json' -d'
{
"name": "สมาร์ทโฟนรุ่นใหม่ล่าสุด กล้องสวย แบตอึด",
"description": "ถ่ายรูปสวยทุกสถานการณ์ พร้อมแบตเตอรี่ใช้งานได้ยาวนานตลอดวัน",
"price": 25000,
"category": "Electronics",
"tags": ["smartphone", "mobile", "camera", "battery"]
}
'
# เพิ่มสินค้าชิ้นที่สาม
curl -X POST "localhost:9200/products/_doc/3?pretty" -H 'Content-Type: application/json' -d'
{
"name": "คีย์บอร์ดเกมมิ่ง RGB พร้อมปุ่ม Macro",
"description": "ประสบการณ์การเล่นเกมที่เหนือกว่า ด้วย Mechanical Keyboard และไฟ RGB ปรับแต่งได้",
"price": 3500,
"category": "Gaming Peripherals",
"tags": ["keyboard", "gaming", "rgb", "macro"]
}
'
คำสั่งข้างต้นจะเพิ่ม Document 3 ชิ้นเข้าไปใน Index products โดยมี ID กำหนดให้เป็น 1, 2, 3 ตามลำดับครับ
ตัวอย่าง Code: Retrieving Document (ดึงข้อมูล)
เราสามารถดึงข้อมูล Document ที่มี ID เฉพาะได้ดังนี้
# ดึงข้อมูลสินค้า ID 1
curl -X GET "localhost:9200/products/_doc/1?pretty"
หรือจะค้นหาข้อมูลทั้งหมดใน Index ก็ได้ครับ
# ค้นหาข้อมูลทั้งหมดใน Index products
curl -X GET "localhost:9200/products/_search?pretty" -H 'Content-Type: application/json' -d'
{
"query": {
"match_all": {}
}
}
'
ตอนนี้เรามีข้อมูลอยู่ใน Elasticsearch แล้ว พร้อมสำหรับการค้นหาแบบ Full-text Search ครับ
การสร้าง Mapping ที่เหมาะสมสำหรับ Full-text Search
Mapping ใน Elasticsearch คือกระบวนการกำหนดว่า Field ต่างๆ ใน Document ควรจะถูกจัดเก็บและประมวลผลอย่างไรบ้างครับ เปรียบเสมือน Schema ของตารางใน RDBMS แต่มีความยืดหยุ่นมากกว่า การกำหนด Mapping ที่เหมาะสมเป็นสิ่งสำคัญอย่างยิ่ง โดยเฉพาะอย่างยิ่งสำหรับ Full-text Search และภาษาไทย
Data Types ใน Elasticsearch
Elasticsearch มี Data Type ให้เลือกใช้มากมาย ซึ่งแต่ละประเภทก็มีคุณสมบัติและวิธีการประมวลผลที่แตกต่างกันไปครับ
text: ใช้สำหรับข้อความที่ต้องการทำ Full-text Search เช่น ชื่อสินค้า, รายละเอียด, เนื้อหาบทความ Field ประเภทนี้จะถูกประมวลผลด้วย Analyzer (Tokenize, Lowercase, Stemming ฯลฯ) และสร้าง Inverted Indexkeyword: ใช้สำหรับข้อความที่ไม่ต้องการทำ Full-text Search แต่ต้องการค้นหาแบบตรงตัว (Exact Match) หรือใช้ในการกรอง (Filter) และทำ Aggregation เช่น รหัสสินค้า, ชื่อหมวดหมู่, แท็ก (Tags) Field ประเภทนี้จะถูกเก็บเป็นคำเดียว ไม่มีการ Tokenizeinteger,long,float,double: สำหรับตัวเลขboolean: สำหรับค่า True/Falsedate: สำหรับวันที่และเวลาobject: สำหรับข้อมูลที่เป็น JSON Object ซ้อนกันnested: คล้ายกับobjectแต่แต่ละ Sub-object จะถูก Index อย่างอิสระ ทำให้สามารถ Query ข้อมูลภายใน Array of Objects ได้อย่างแม่นยำgeo_point: สำหรับพิกัดทางภูมิศาสตร์ (ละติจูด, ลองจิจูด) ใช้สำหรับการค้นหาตามตำแหน่ง
การเลือก Data Type ที่ถูกต้องจะส่งผลโดยตรงต่อประสิทธิภาพและความแม่นยำของการค้นหาครับ
การกำหนด Custom Analyzer สำหรับภาษาไทย
สำหรับภาษาไทย ซึ่งไม่มีการเว้นวรรคระหว่างคำ การใช้ Standard Analyzer จะไม่สามารถตัดคำภาษาไทยได้อย่างถูกต้อง ทำให้การค้นหาไม่แม่นยำ เราจึงจำเป็นต้องกำหนด Custom Analyzer ที่ใช้ Thai Tokenizer ครับ
ก่อนอื่น คุณต้องติดตั้ง Elasticsearch ICU Analysis Plugin เพื่อรองรับ Thai Tokenizer ซึ่งเป็นส่วนหนึ่งของ ICU (International Components for Unicode)
# รันคำสั่งนี้ใน container ของ elasticsearch (หรือบนเครื่อง host ถ้าติดตั้งแบบ standalone)
docker exec -it elasticsearch bin/elasticsearch-plugin install analysis-icu
หลังจากติดตั้ง Plugin แล้ว คุณจะต้อง Restart Elasticsearch container (docker-compose restart elasticsearch) เพื่อให้ Plugin มีผล
จากนั้น เราสามารถกำหนด Mapping สำหรับ Index products_thai โดยใช้ Custom Analyzer ครับ
ตัวอย่าง Code: Custom Thai Analyzer Mapping
เราจะสร้าง Index ใหม่ชื่อ products_thai พร้อมกับกำหนด Custom Analyzer ที่ชื่อ thai_analyzer
curl -X PUT "localhost:9200/products_thai?pretty" -H 'Content-Type: application/json' -d'
{
"settings": {
"analysis": {
"analyzer": {
"thai_analyzer": {
"tokenizer": "icu_tokenizer",
"filter": [
"icu_normalizer",
"icu_folding",
"lowercase",
"thai_stopwords"
]
}
},
"filter": {
"thai_stopwords": {
"type": "stop",
"stopwords": "_thai_"
}
}
}
},
"mappings": {
"properties": {
"name": {
"type": "text",
"analyzer": "thai_analyzer"
},
"description": {
"type": "text",
"analyzer": "thai_analyzer"
},
"price": {
"type": "float"
},
"category": {
"type": "keyword"
},
"tags": {
"type": "keyword"
}
}
}
}
'
ใน Mapping ข้างต้น:
- เรากำหนด
thai_analyzerโดยใช้icu_tokenizerสำหรับการตัดคำภาษาไทย - เพิ่ม
icu_normalizerและicu_foldingสำหรับการปรับรูปแบบตัวอักษรให้เป็นมาตรฐาน lowercaseเพื่อแปลงเป็นตัวพิมพ์เล็กทั้งหมดthai_stopwordsเพื่อลบคำ Stop Words ภาษาไทย (เช่น “และ”, “หรือ”, “ของ”)- Field
nameและdescriptionถูกกำหนดให้ใช้thai_analyzer - Field อื่นๆ เช่น
price,category,tagsใช้ Type ที่เหมาะสมกับการกรองและการทำ Aggregation
หลังจากสร้าง Index และ Mapping แล้ว คุณสามารถ Index ข้อมูลภาษาไทยเข้าไปใน products_thai Index ได้เหมือนเดิมครับ
# เพิ่มสินค้าภาษาไทยเข้าไปใน Index products_thai
curl -X POST "localhost:9200/products_thai/_doc/1?pretty" -H 'Content-Type: application/json' -d'
{
"name": "โน้ตบุ๊กประสิทธิภาพสูงสำหรับการทำงาน",
"description": "โน้ตบุ๊กบางเบา ทรงพลัง เหมาะสำหรับนักพัฒนาและนักออกแบบกราฟิก",
"price": 35000,
"category": "Electronics",
"tags": ["notebook", "laptop", "work", "developer", "graphic design"]
}
'
curl -X POST "localhost:9200/products_thai/_doc/2?pretty" -H 'Content-Type: application/json' -d'
{
"name": "สมาร์ทโฟนรุ่นใหม่ล่าสุด กล้องสวย แบตอึด",
"description": "ถ่ายรูปสวยทุกสถานการณ์ พร้อมแบตเตอรี่ใช้งานได้ยาวนานตลอดวัน",
"price": 25000,
"category": "Electronics",
"tags": ["smartphone", "mobile", "camera", "battery"]
}
'
เมื่อมี Custom Analyzer ที่เหมาะสม การค้นหาภาษาไทยก็จะแม่นยำและมีประสิทธิภาพมากขึ้นอย่างเห็นได้ชัดครับ
เทคนิคการค้นหาขั้นสูงด้วย Elasticsearch
Elasticsearch มีความสามารถในการค้นหาที่หลากหลายและทรงพลังมากครับ เพื่อให้ระบบค้นหาของคุณฉลาดและตอบโจทย์ผู้ใช้ได้มากที่สุด เรามาดูเทคนิคการค้นหาขั้นสูงต่างๆ กันครับ
Query DSL: ภาษาสำหรับการค้นหาที่ทรงพลัง
Elasticsearch ใช้ภาษาที่เรียกว่า Query DSL (Domain Specific Language) ซึ่งเป็น JSON-based สำหรับการสร้าง Query ที่ซับซ้อนและยืดหยุ่น Query DSL ช่วยให้เราสามารถรวม Query ประเภทต่างๆ เข้าด้วยกัน กำหนด Weighting, Boosting หรือ Filtering ได้อย่างละเอียด
โครงสร้างพื้นฐานของ Query DSL มักจะมี query object ซึ่งภายในจะประกอบด้วย Query Clauses ต่างๆ เช่น match, term, bool เป็นต้นครับ
Basic Queries: match, term, multi_match
match Query: ค้นหา Full-text
match Query เป็น Query ประเภทที่นิยมใช้มากที่สุดสำหรับการทำ Full-text Search ครับ มันจะประมวลผลคำค้นหาผ่าน Analyzer (เดียวกับที่ใช้ตอน Indexing) ก่อนทำการค้นหาใน Inverted Index ทำให้รองรับการตัดคำ, Lowercase, Stop Words ฯลฯ
ตัวอย่าง Code: Basic Match Query
ค้นหาสินค้าที่มีคำว่า “โน้ตบุ๊ก” ใน Field name หรือ description (ใน Index products_thai)
curl -X GET "localhost:9200/products_thai/_search?pretty" -H 'Content-Type: application/json' -d'
{
"query": {
"match": {
"name": "โน้ตบุ๊ก"
}
}
}
'
หรือค้นหาคำว่า “กล้อง” ใน Field description
curl -X GET "localhost:9200/products_thai/_search?pretty" -H 'Content-Type: application/json' -d'
{
"query": {
"match": {
"description": "กล้อง"
}
}
}
'
term Query: ค้นหาคำตรงตัว
term Query ใช้สำหรับการค้นหาคำตรงตัวแบบ “Exact Match” ครับ มันจะไม่ประมวลผลคำค้นหาผ่าน Analyzer และจะค้นหาเฉพาะ Term ที่ตรงกันเป๊ะๆ ใน Inverted Index เท่านั้น เหมาะสำหรับ Field ประเภท keyword หรือเมื่อคุณรู้ Term ที่แน่นอน
curl -X GET "localhost:9200/products_thai/_search?pretty" -H 'Content-Type: application/json' -d'
{
"query": {
"term": {
"category.keyword": {
"value": "Electronics"
}
}
}
}
'
หมายเหตุ: เราใช้ category.keyword เพราะ Field category ถูก Map เป็น keyword ครับ
multi_match Query: ค้นหาหลาย Field พร้อมกัน
multi_match Query ช่วยให้คุณสามารถค้นหาคำเดียวกันในหลายๆ Field พร้อมกันได้ และยังสามารถกำหนด Boost (น้ำหนักความสำคัญ) ให้กับแต่ละ Field ได้ด้วยครับ
curl -X GET "localhost:9200/products_thai/_search?pretty" -H 'Content-Type: application/json' -d'
{
"query": {
"multi_match": {
"query": "โน้ตบุ๊ก",
"fields": ["name^3", "description"]
}
}
}
'
ในตัวอย่างนี้ คำว่า “โน้ตบุ๊ก” จะถูกค้นหาทั้งใน Field name และ description โดย Field name จะมีน้ำหนักความสำคัญ (Boost) เป็น 3 เท่าของ description ครับ
Phrase Search: ค้นหาวลี
บางครั้งผู้ใช้ต้องการค้นหาวลี (Phrase) ที่มีคำหลายคำเรียงติดกันตามลำดับ เช่น “โน้ตบุ๊กประสิทธิภาพสูง” ไม่ใช่แค่ “โน้ตบุ๊ก” และ “ประสิทธิภาพสูง” ที่ปรากฏที่ไหนก็ได้ใน Document match_phrase Query คือคำตอบครับ
ตัวอย่าง Code: Phrase Match Query
curl -X GET "localhost:9200/products_thai/_search?pretty" -H 'Content-Type: application/json' -d'
{
"query": {
"match_phrase": {
"description": "นักพัฒนาและนักออกแบบ"
}
}
}
'
Query นี้จะค้นหา Document ที่มีวลี “นักพัฒนาและนักออกแบบ” ปรากฏติดกันใน Field description เท่านั้นครับ
Fuzzy Search: การค้นหาที่ทนต่อการสะกดผิด
ผู้ใช้มักจะพิมพ์ผิดเล็กน้อย (Typo) fuzzy Query ช่วยให้ระบบค้นหาคำที่คล้ายกันได้ แม้จะสะกดผิดไปบ้าง โดยใช้ Levenshtein distance (หรือ Edit Distance) เป็นเกณฑ์
ตัวอย่าง Code: Fuzzy Query
ค้นหาคำว่า “โน้ตบุ๊ค” (สะกดผิดจาก “โน้ตบุ๊ก”) โดยอนุญาตให้มีข้อผิดพลาดได้ 1 ตัวอักษร (fuzziness: "AUTO" จะให้ Elasticsearch คำนวณค่าที่เหมาะสมเอง)
curl -X GET "localhost:9200/products_thai/_search?pretty" -H 'Content-Type: application/json' -d'
{
"query": {
"match": {
"name": {
"query": "โน้ตบุ๊ค",
"fuzziness": "AUTO"
}
}
}
}
'
ด้วย fuzziness ระบบจะยังคงสามารถหา “โน้ตบุ๊ก” เจอได้ แม้จะสะกด “โน้ตบุ๊ค” ก็ตามครับ
Autocomplete และ Suggestion: แนะนำคำค้นหา
ฟังก์ชัน Autocomplete และ Suggestion ช่วยให้ผู้ใช้ค้นหาได้เร็วขึ้นและลดความผิดพลาดในการพิมพ์ เป็นคุณสมบัติที่สำคัญสำหรับประสบการณ์ผู้ใช้ที่ดีครับ
Completion Suggester
Elasticsearch มี Data Type พิเศษชื่อ completion ที่ออกแบบมาโดยเฉพาะสำหรับ Autocomplete ครับ โดยเราจะต้องกำหนด Field เป็น Type นี้ใน Mapping
ขั้นตอน:
- ปรับปรุง Mapping: เพิ่ม Field สำหรับ
completionType - Indexing ข้อมูล: เพิ่มข้อมูลลงใน Field นั้น
- Query ด้วย Suggester API: ใช้ Suggester API ในการดึงคำแนะนำ
เราจะปรับปรุง Mapping ของ products_thai Index (หรือสร้างใหม่) เพื่อเพิ่ม Field suggest_name
# ปิด Index ก่อนเพื่อปรับปรุง Mapping
curl -X POST "localhost:9200/products_thai/_close"
# อัปเดต Mapping (สามารถเพิ่ม field ได้โดยไม่ต้องลบ index)
curl -X PUT "localhost:9200/products_thai/_mapping?pretty" -H 'Content-Type: application/json' -d'
{
"properties": {
"suggest_name": {
"type": "completion",
"analyzer": "thai_analyzer"
}
}
}
'
# เปิด Index กลับมาใช้งาน
curl -X POST "localhost:9200/products_thai/_open"
จากนั้น Index ข้อมูลใหม่ หรือ Update Document เดิม เพื่อใส่ข้อมูลใน Field suggest_name
# อัปเดต Document 1
curl -X POST "localhost:9200/products_thai/_update/1?pretty" -H 'Content-Type: application/json' -d'
{
"doc": {
"suggest_name": {
"input": ["โน้ตบุ๊ก", "โน้ตบุ๊กประสิทธิภาพสูง", "โน้ตบุ๊กทำงาน"]
}
}
}
'
# อัปเดต Document 2
curl -X POST "localhost:9200/products_thai/_update/2?pretty" -H 'Content-Type: application/json' -d'
{
"doc": {
"suggest_name": {
"input": ["สมาร์ทโฟน", "สมาร์ทโฟนรุ่นใหม่", "กล้องสวย", "แบตอึด"]
}
}
}
'
ตัวอย่าง Code: Completion Suggester Mapping & Query
เมื่อข้อมูลพร้อม เราสามารถใช้ Suggester API ได้:
curl -X GET "localhost:9200/products_thai/_search?pretty" -H 'Content-Type: application/json' -d'
{
"suggest": {
"product-suggester": {
"prefix": "สมาร์ท",
"completion": {
"field": "suggest_name",
"size": 5
}
}
}
}
'
ผลลัพธ์ที่ได้จะเป็นคำแนะนำเช่น “สมาร์ทโฟน”, “สมาร์ทโฟนรุ่นใหม่” ซึ่งช่วยให้ผู้ใช้พิมพ์คำค้นหาได้เร็วขึ้นครับ
Highlighting: เน้นคำที่ค้นหา
การเน้นคำที่ค้นหา (Highlighting) ในผลลัพธ์ช่วยให้ผู้ใช้เห็นว่าทำไม Document นั้นๆ ถึงเกี่ยวข้องกับคำค้นหาของพวกเขา ซึ่งช่วยเพิ่มประสบการณ์ผู้ใช้ได้อย่างมากครับ
ตัวอย่าง Code: Highlighting in Search Results
curl -X GET "localhost:9200/products_thai/_search?pretty" -H 'Content-Type: application/json' -d'
{
"query": {
"match": {
"description": "นักพัฒนา"
}
},
"highlight": {
"fields": {
"description": {}
},
"pre_tags": ["<em>"],
"post_tags": ["</em>"]
}
}
'
ในผลลัพธ์ คุณจะเห็นว่าคำว่า “นักพัฒนา” ใน Field description ถูกห่อหุ้มด้วยแท็ก <em> และ </em> ซึ่งคุณสามารถนำไปจัดรูปแบบในหน้าเว็บของคุณได้ครับ
Filtering และ Aggregation: การกรองข้อมูลและการวิเคราะห์เชิงลึก
นอกจากการค้นหาแล้ว Elasticsearch ยังโดดเด่นในเรื่องของการกรองข้อมูล (Filtering) และการรวมข้อมูลเพื่อวิเคราะห์ (Aggregation) ซึ่งเป็นคุณสมบัติสำคัญสำหรับการสร้างระบบ E-commerce หรือ Dashboards ครับ
Filtering: การกรองข้อมูล
filter Query ใช้สำหรับการกรองข้อมูลที่ไม่ส่งผลต่อคะแนนความเกี่ยวข้อง (Score) และมักจะใช้ Cache ซึ่งทำให้มีประสิทธิภาพสูง เหมาะสำหรับเงื่อนไขที่ต้องการผลลัพธ์แบบ Binary (ใช่/ไม่ใช่) เช่น ค้นหาสินค้าในหมวดหมู่ที่กำหนด หรือสินค้าที่มีราคาอยู่ในช่วงที่กำหนด
ตัวอย่าง Code: Filter Query
ค้นหาสินค้าที่มีคำว่า “โน้ตบุ๊ก” และอยู่ในหมวดหมู่ “Electronics” ที่มีราคาไม่เกิน 30000 บาท
curl -X GET "localhost:9200/products_thai/_search?pretty" -H 'Content-Type: application/json' -d'
{
"query": {
"bool": {
"must": {
"match": {
"name": "โน้ตบุ๊ก"
}
},
"filter": [
{ "term": { "category.keyword": "Electronics" }},
{ "range": { "price": { "lte": 30000 }}}
]
}
}
}
'
ใน Query นี้ must Clause ใช้สำหรับ Full-text Search ที่ส่งผลต่อ Score ในขณะที่ filter Clause ใช้สำหรับการกรองข้อมูลที่รวดเร็วและไม่ส่งผลต่อ Score ครับ
Aggregation: การรวมข้อมูลเพื่อวิเคราะห์
Aggregation คือการรวบรวมข้อมูลเพื่อสร้างรายงานหรือสถิติต่างๆ เช่น จำนวนสินค้าในแต่ละหมวดหมู่, สินค้ายอดนิยม, ช่วงราคาของสินค้า เป็นต้น Aggregation เป็นหัวใจสำคัญของ Dashboards และการวิเคราะห์ข้อมูล
ตัวอย่าง Code: Aggregation Query (e.g., Top Tags)
นับจำนวนสินค้าในแต่ละ category
curl -X GET "localhost:9200/products_thai/_search?pretty" -H 'Content-Type: application/json' -d'
{
"size": 0,
"aggs": {
"products_by_category": {
"terms": {
"field": "category.keyword",
"size": 10
}
}
}
}
'
ผลลัพธ์จะแสดงจำนวนสินค้าในแต่ละหมวดหมู่ ซึ่งสามารถนำไปสร้าง Faceted Search (การกรองตามคุณสมบัติ) หรือ Pie Chart ได้ครับ
ด้วย Query DSL และความสามารถที่หลากหลายของ Elasticsearch คุณสามารถสร้างระบบค้นหาที่ซับซ้อนและตอบโจทย์ความต้องการของผู้ใช้ได้อย่างเต็มที่ครับ อ่านเพิ่มเติมเกี่ยวกับ Query DSL
การปรับแต่งประสิทธิภาพและการ Scaling
เมื่อระบบค้นหาของคุณเริ่มมีข้อมูลมากขึ้น หรือมีผู้ใช้งานพร้อมกันจำนวนมาก การปรับแต่งประสิทธิภาพและการวางแผนการ Scale ระบบจึงเป็นสิ่งสำคัญครับ
การออกแบบ Shards และ Replicas
- จำนวน Primary Shard: การกำหนดจำนวน Primary Shard ที่เหมาะสมเป็นสิ่งสำคัญ ควรวางแผนตั้งแต่แรก เพราะไม่สามารถเปลี่ยนแปลงได้ง่ายๆ หลังจากสร้าง Index แล้ว จำนวน Shard ที่มากเกินไปจะเพิ่ม Overhead ในการจัดการ Cluster ในขณะที่น้อยเกินไปจะจำกัดความสามารถในการ Scale ควรเริ่มต้นด้วยจำนวน Shard ที่เหมาะสมกับปริมาณข้อมูลที่คาดการณ์ไว้ และกระจายไปยัง Node ต่างๆ ครับ
- จำนวน Replica Shard: Replica Shard มีหน้าที่เพิ่ม Fault Tolerance และช่วยเพิ่มประสิทธิภาพในการอ่านข้อมูล (Read Throughput) การมี Replica อย่างน้อย 1 ชุดเป็นสิ่งแนะนำเพื่อป้องกันข้อมูลสูญหายหาก Node ใด Node หนึ่งล้มเหลว และยังช่วยกระจายภาระการค้นหาได้ด้วย หากคุณต้องการเพิ่มความสามารถในการอ่าน ก็สามารถเพิ่มจำนวน Replica ได้ครับ
JVM Heap Size
Elasticsearch รันบน JVM (Java Virtual Machine) ดังนั้นการกำหนดขนาด Heap Memory ที่เหมาะสมจึงเป็นสิ่งสำคัญ การตั้งค่า ES_JAVA_OPTS ใน docker-compose.yml (หรือ jvm.options ใน Standalone Installation) ควรตั้งค่า -Xms และ -Xmx ให้เท่ากัน เพื่อป้องกันการปรับขนาด Heap ระหว่าง Runtime ซึ่งอาจทำให้เกิด Pause ได้
- หลักการ: ไม่ควรเกิน 50% ของ RAM ทั้งหมดของ Server และไม่ควรเกิน 30-32 GB เพราะ JVM จะใช้ประโยชน์จาก Pointer Compression ได้อย่างเต็มที่
- ตัวอย่าง: หาก Server มี RAM 16 GB ควรกำหนด Heap Size ประมาณ 8 GB
Hardware Considerations
- CPU: Elasticsearch ใช้ CPU ค่อนข้างมาก โดยเฉพาะในระหว่างการ Indexing และ Query ที่ซับซ้อน ควรเลือก CPU ที่มี Core จำนวนมากและมีความเร็วสูง
- RAM: RAM เป็นสิ่งสำคัญที่สุด Elasticsearch ใช้ RAM สำหรับ Inverted Index, Caching และ JVM Heap Memory ควรมี RAM เพียงพอเพื่อหลีกเลี่ยงการ Swap ไปยัง Disk
- Disk I/O: Storage Speed มีผลอย่างมากต่อประสิทธิภาพ โดยเฉพาะเมื่อมีการ Indexing หรือ Query ที่ต้องอ่านข้อมูลจาก Disk จำนวนมาก แนะนำให้ใช้ SSD หรือ NVMe เพื่อประสิทธิภาพสูงสุด
- Network: ใน Cluster แบบกระจายศูนย์ Network Latency และ Bandwidth มีผลต่อประสิทธิภาพการสื่อสารระหว่าง Node ควรใช้ Network ที่มีความเร็วสูงและเสถียร
Index Lifecycle Management (ILM)
ILM ช่วยให้คุณจัดการวงจรชีวิตของ Index ได้โดยอัตโนมัติ ตั้งแต่การสร้าง, การย้ายไปสู่ Hot/Warm/Cold Tier, การ Read-only, ไปจนถึงการลบ เหมาะสำหรับข้อมูลประเภท Time-series (เช่น Log) หรือข้อมูลที่มีอายุ
- Hot: ข้อมูลใหม่ที่กำลังถูก Index และถูก Query บ่อยๆ
- Warm: ข้อมูลเก่าลงมาหน่อย แต่ยังถูก Query อยู่บ้าง
- Cold/Frozen: ข้อมูลเก่ามาก ที่แทบไม่ถูก Query แล้ว อาจย้ายไปเก็บใน Storage ที่ถูกกว่า
- Delete: ลบ Index เมื่อข้อมูลหมดอายุ
การใช้ ILM ช่วยลดภาระการจัดการและเพิ่มประสิทธิภาพการใช้ทรัพยากรได้อย่างมากครับ
เปรียบเทียบ Elasticsearch กับระบบค้นหาแบบดั้งเดิม
เพื่อเห็นภาพชัดเจนขึ้น ลองมาดูตารางเปรียบเทียบระหว่าง Elasticsearch กับระบบค้นหาที่ใช้ RDBMS กันครับ
| คุณสมบัติ | Elasticsearch | RDBMS (เช่น MySQL, PostgreSQL) |
|---|---|---|
| วัตถุประสงค์หลัก | Full-text Search, Real-time Analytics, Log & Metrics | Transactional Data, Relational Data, Data Integrity |
| รูปแบบข้อมูล | JSON Document (Schema-less / Dynamic Mapping) | Tabular (Rows & Columns) with Strict Schema |
| โครงสร้างดัชนี | Inverted Index (Optimized for text search) | B-Tree Index (Optimized for exact match, range queries) |
| ความเร็วในการค้นหา Full-text | รวดเร็วมาก (มิลลิวินาที) | ช้า (ต้องใช้ LIKE %keyword% หรือ Full-text Index ที่มีข้อจำกัด) |
| ความสามารถ Full-text Search | สูง: รองรับ Fuzzy, Phrase, Synonym, Autocomplete, Highlighting, Relevance Scoring | ต่ำ: ส่วนใหญ่เป็น Exact Match, Full-text Index มีข้อจำกัด (ไม่รองรับภาษาไทยเท่าที่ควร, จำกัดฟังก์ชัน) |
| การจัดการภาษาไทย | ยอดเยี่ยม: รองรับ Thai Analyzer สำหรับการตัดคำที่แม่นยำ | จำกัด: ต้องใช้ Extension เพิ่มเติมและยังไม่เทียบเท่า |
| การวิเคราะห์ข้อมูล (Analytics) | ยอดเยี่ยม: Aggregation Framework, Real-time Analytics | ปานกลาง: ต้องใช้ SQL JOIN และ Group By ซึ่งอาจช้ากับข้อมูลใหญ่ |
| การขยายขนาด (Scalability) | ยอดเยี่ยม: ออกแบบมาเพื่อ Scale Out (กระจาย Node) ได้ง่าย รองรับข้อมูลมหาศาล | ปานกลาง: Scale Up (เพิ่มทรัพยากร Server) เป็นหลัก, Scale Out ซับซ้อนกว่ามาก |
| ความทนทานต่อความผิดพลาด (Fault Tolerance) | สูง: ด้วย Replica Shard และ Cluster Management อัตโนมัติ | ปานกลาง: ต้องมีการทำ Replication หรือ Cluster Setup ที่ซับซ้อน |
| ข้อจำกัด | ไม่เหมาะกับ Transactional Data ที่ต้องการ ACID Compliance สูง | ไม่เหมาะกับ Full-text Search ขนาดใหญ่, Analytics แบบ Real-time |
จากตารางจะเห็นได้ว่า Elasticsearch ถูกสร้างมาเพื่อแก้ปัญหาที่ RDBMS ไม่ได้ถูกออกแบบมาให้ทำได้ดี โดยเฉพาะอย่างยิ่งในเรื่องของ Full-text Search และการวิเคราะห์ข้อมูลขนาดใหญ่แบบเรียลไทม์ครับ
กรณีศึกษาและการประยุกต์ใช้ Elasticsearch ในธุรกิจ
Elasticsearch ได้รับความนิยมอย่างแพร่หลายในอุตสาหกรรมต่างๆ ลองมาดูกรณีศึกษาและการประยุกต์ใช้ที่น่าสนใจกันครับ
E-commerce: ค้นหาสินค้า
สำหรับเว็บไซต์ E-commerce ขนาดใหญ่ที่มีสินค้าหลายแสนถึงหลายล้านรายการ Elasticsearch คือหัวใจสำคัญของระบบค้นหาสินค้าครับ
- ค้นหาสินค้าที่เกี่ยวข้อง: ผู้ใช้พิมพ์ “เสื้อยืดสีขาว” ระบบสามารถแสดงผลลัพธ์ที่ตรงกับคำค้นหา พร้อมทั้งแนะนำสินค้าที่คล้ายกัน หรือสินค้าขายดี
- Faceted Search: ผู้ใช้สามารถกรองสินค้าตามหมวดหมู่, แบรนด์, ราคา, สี, ขนาด หรือคุณสมบัติอื่นๆ ได้อย่างรวดเร็ว
- Autocomplete & Suggestion: เมื่อผู้ใช้เริ่มพิมพ์ ระบบจะแนะนำคำค้นหา หรือชื่อสินค้าที่เกี่ยวข้อง
- Personalized Search: ปรับแต่งผลลัพธ์การค้นหาตามพฤติกรรมและความชอบของผู้ใช้แต่ละคน
- Promoted Results: สามารถกำหนดให้สินค้าบางรายการปรากฏขึ้นมาเป็นอันดับแรกในผลการค้นหาเพื่อส่งเสริมการขายได้
Media & Publishing: ค้นหาข่าว บทความ
สำหรับสำนักข่าว เว็บไซต์บล็อก หรือแพลตฟอร์มเนื้อหาต่างๆ Elasticsearch ช่วยให้ผู้ใช้สามารถเข้าถึงเนื้อหาที่ต้องการได้อย่างรวดเร็ว
- ค้นหาบทความ/ข่าวสาร: ค้นหาจากหัวข้อ, เนื้อหา, ชื่อผู้เขียน, วันที่เผยแพร่
- Related Articles: แนะนำบทความที่เกี่ยวข้องกับสิ่งที่ผู้ใช้กำลังอ่านอยู่
- Trending Topics: วิเคราะห์คำค้นหายอดนิยม หรือหัวข้อข่าวที่กำลังเป็นกระแส
- Real-time Indexing: บทความใหม่สามารถถูก Index และค้นหาได้ทันทีที่เผยแพร่
Log & Analytics: วิเคราะห์ Log
Elasticsearch เป็นหัวใจของ ELK Stack (Elasticsearch, Logstash, Kibana) ซึ่งเป็นโซลูชันยอดนิยมสำหรับการจัดการและวิเคราะห์ Log
- รวบรวม Log จากหลายแหล่ง: Logstash และ Beats สามารถรวบรวม Log จาก Server, แอปพลิเคชัน, Network Devices ได้หลากหลาย
- ค้นหาและวิเคราะห์ Log แบบเรียลไทม์: นักพัฒนาและ Ops team สามารถค้นหา Log ที่มี Error, Warning หรือตรวจสอบพฤติกรรมการใช้งานได้อย่างรวดเร็ว
- Monitoring & Alerting: สร้าง Dashboards ใน Kibana เพื่อแสดงผล Metrics ต่างๆ และตั้งค่า Alert เมื่อเกิดเหตุการณ์ผิดปกติ