PlusMagi's Blog By Pitt Phunsanit Database,Technology Database Search Optimization: การทำ Full-Text Search (FTS) ภาษาไทย รวดเร็วกว่า LIKE ‘%keyword%’

Database Search Optimization: การทำ Full-Text Search (FTS) ภาษาไทย รวดเร็วกว่า LIKE ‘%keyword%’

ในยุคที่ข้อมูลคือสินทรัพย์หลัก การค้นหาที่รวดเร็วและแม่นยำคือหัวใจสำคัญของ User Experience (UX) ระบบที่ต้องจัดการกับข้อมูลขนาดใหญ่ (Big Data) จำเป็นต้องมีกลไกการค้นหาที่เหนือกว่าการจับคู่สตริงแบบพื้นฐาน การค้นหาที่ดีไม่เพียงแต่ต้อง ‘เจอ’ แต่ต้อง ‘เร็ว’ และ ‘เข้าใจบริบท’ ของภาษาได้อย่างลึกซึ้ง

ปัญหาคอขวดของ LIKE ‘%keyword%’ ใน PostgreSQL

เมื่อนักพัฒนาใช้คำสั่ง `WHERE column LIKE ‘%keyword%’` เป็นวิธีที่ง่ายและเข้าใจได้ แต่ในเชิงประสิทธิภาพ คำสั่งนี้มีข้อจำกัดที่ร้ายแรงเมื่อชุดข้อมูลมีขนาดใหญ่ เพราะ PostgreSQL จะถูกบังคับให้ทำ Full Table Scan กล่าวคือ ระบบต้องอ่านข้อมูลทุกแถวในตารางเพื่อตรวจสอบว่ามีสตริงที่ตรงกันหรือไม่ การสแกนแบบนี้จะทำให้เกิดคอขวด (Bottleneck) ของเวลาประมวลผลอย่างชัดเจน

Full-Text Search (FTS) คือทางออกสำหรับประสิทธิภาพสูงสุด

Full-Text Search (FTS) ไม่ใช่แค่การค้นหา แต่คือการสร้าง ดัชนีข้อความ (Text Index) โดยเฉพาะ ซึ่งทำให้ฐานข้อมูลสามารถระบุตำแหน่งที่เกี่ยวข้องได้อย่างรวดเร็วโดยไม่ต้องอ่านทุกแถว ข้อมูลที่ถูกจัดเก็บในดัชนี FTS จะถูกประมวลผลผ่านกระบวนการสำคัญ 2 อย่าง คือ Tokenization (การแยกคำ) และ Stemming (การลดรูปคำให้เหลือรากศัพท์) ซึ่งช่วยให้การค้นหามีความแม่นยำสูงกว่าการจับคู่สตริงแบบตรงตัว

การประยุกต์ใช้ FTS ใน PostgreSQL สำหรับภาษาไทย

สำหรับ PostgreSQL การใช้ FTS มีความทรงพลังอย่างยิ่งในการจัดการกับภาษาที่มีความซับซ้อนอย่างภาษาไทย แม้ว่าภาษาไทยจะไม่มีการเว้นวรรคระหว่างคำเสมอไป แต่ FTS ก็ช่วยให้เราสามารถสร้างดัชนีที่แยกคำได้อย่างมีประสิทธิภาพกว่าการใช้ `LIKE` มาก

ขั้นตอนการทำงานใน PostgreSQL จะประกอบด้วยการแปลงข้อมูลให้อยู่ในรูปแบบ tsvector (Vector ของคำที่ถูกจัดทำดัชนี) และการเปรียบเทียบกับ tsquery (Query ของคำที่ผู้ใช้ป้อน) ซึ่งเป็นกลไกที่เร็วกว่าการสแกนแบบแถวต่อแถวหลายเท่าตัว

SQL

-- 1. สมมติว่ามีตาราง articles และคอลัมน์ content ที่ต้องการค้นหา<br>-- 2. สร้างคอลัมน์สำหรับเก็บ Vector<br>ALTER TABLE articles ADD COLUMN tsv tsvector;<br><br>-- 3. อัปเดต Vector โดยใช้ to_tsvector (ตัวอย่างการสร้างดัชนี)<br>UPDATE articles SET tsv = to_tsvector('thai', content);<br><br>-- 4. การค้นหาด้วย FTS (ใช้ & สำหรับ AND, | สำหรับ OR)<br>SELECT title, content FROM articles WHERE tsv @@ to_tsquery('thai', 'apple & banana');<br>-- หมายเหตุ: การสร้าง Index บน tsv จะช่วยให้ Query นี้เร็วขึ้นมาก<br>CREATE INDEX idx_fts ON articles USING GIN (tsv);

บทสรุป: เมื่อไหร่ควรใช้ FTS?

สรุปได้ว่า การใช้ `LIKE ‘%keyword%’` เหมาะสำหรับการค้นหาข้อมูลขนาดเล็กมาก หรือเมื่อความแม่นยำในการจับคู่สตริงแบบตรงตัว (Exact Match) คือสิ่งสำคัญที่สุด แต่เมื่อระบบของคุณต้องรองรับปริมาณข้อมูลที่เพิ่มขึ้นอย่างต่อเนื่อง (Scalability) และต้องการความเร็วในการค้นหาที่ระดับแอปพลิเคชันระดับองค์กร Full-Text Search ใน PostgreSQL คือคำตอบทางเทคนิคที่เหนือกว่าอย่างชัดเจน มันช่วยให้คุณทั้งประหยัดทรัพยากรของเซิร์ฟเวอร์และมอบประสบการณ์การค้นหาที่รวดเร็วและเป็นธรรมชาติให้กับผู้ใช้งานได้อย่างสมบูรณ์