PostgreSQL ไม่ได้เป็นเพียง Relational Database ธรรมดาเท่านั้น แต่ยังมีความสามารถขั้นสูงในการค้นหาข้อความแบบ Full-Text Search ที่ทำให้เราสามารถค้นหาข้อมูลจากข้อความจำนวนมหาศาลได้อย่างมีประสิทธิภาพ บทความนี้จะอธิบายการทำงานของ Full-Text Search, การใช้งานจริง และ Best Practices
Full-Text Search คืออะไร?
Full-Text Search คือความสามารถในการค้นหาข้อความโดยไม่ใช่แค่การเปรียบเทียบแบบ Exact Match แต่รวมถึงการวิเคราะห์คำ (Lexemes), การตัดคำ (Tokenization) และการค้นหาที่ยืดหยุ่นมากขึ้น เช่น ค้นหาคำพ้อง, คำที่มีรากศัพท์เดียวกัน
พื้นฐานการทำงาน
- tsvector → ใช้เก็บข้อความในรูปแบบที่พร้อมค้นหา
- tsquery → ใช้สำหรับระบุคำค้น
- GIN Index → ช่วยให้การค้นหามีประสิทธิภาพสูง
ตัวอย่างการใช้งาน Full-Text Search
1. สร้างตารางเก็บข้อความ
CREATE TABLE articles ( id SERIAL PRIMARY KEY, title TEXT, content TEXT );
2. แปลงข้อความเป็น tsvector
SELECT to_tsvector('english', 'PostgreSQL Full Text Search is powerful');
ผลลัพธ์จะเป็น Lexemes ที่พร้อมสำหรับการค้นหา
3. ค้นหาด้วย tsquery
SELECT to_tsquery('english', 'postgres & search');
จะคืนค่าคำค้นในรูปแบบที่ PostgreSQL เข้าใจ เช่น 'postgres' & 'search'
4. ใช้ในการ Query จริง
SELECT id, title FROM articles WHERE to_tsvector('english', content) @@ to_tsquery('english', 'postgres & search');
การใช้ Index เพื่อเพิ่มความเร็ว
การทำ Full-Text Search บนข้อมูลจำนวนมาก หากไม่ใช้ Index จะทำงานช้า PostgreSQL แนะนำให้ใช้ GIN Index
CREATE INDEX idx_articles_content ON articles USING GIN (to_tsvector('english', content));

การค้นหาหลายภาษา
PostgreSQL รองรับ Full-Text Search หลายภาษา เช่น english
, simple
, thai
โดยแต่ละภาษาจะมี Dictionary ของตัวเอง
SELECT to_tsvector('thai', 'การค้นหาข้อความใน PostgreSQL');
การจัดอันดับผลลัพธ์ (Ranking)
PostgreSQL สามารถจัดอันดับผลลัพธ์การค้นหาได้ด้วย ts_rank
SELECT id, title, ts_rank(to_tsvector(content), to_tsquery('postgres')) AS rank FROM articles WHERE to_tsvector(content) @@ to_tsquery('postgres') ORDER BY rank DESC;
Highlight คำที่ค้นหา
PostgreSQL รองรับฟังก์ชัน ts_headline
สำหรับ Highlight คำที่ค้นหาในเนื้อหา
SELECT ts_headline('english', content, to_tsquery('postgres')) FROM articles;
ข้อดีของ Full-Text Search
- ค้นหาข้อความได้เร็วและยืดหยุ่น
- รองรับหลายภาษา
- รองรับ Ranking และ Highlight
- ทำงานได้โดยตรงใน PostgreSQL ไม่ต้องใช้ระบบ Search แยก
ข้อจำกัดของ Full-Text Search
- ซับซ้อนขึ้นเมื่อข้อมูลมีหลายภาษา
- อาจไม่เร็วเท่า Search Engine เฉพาะทาง เช่น Elasticsearch
- ต้องใช้ Index เพื่อประสิทธิภาพที่ดี
Best Practices
- สร้าง GIN Index เสมอสำหรับ Field ข้อความ
- ใช้ Dictionary ที่ตรงกับภาษา
- ใช้ Ranking และ Highlight เพื่อ UX ที่ดี
- หากระบบใหญ่มาก อาจพิจารณาใช้ FDW เชื่อมกับ Elasticsearch

สรุป
Full-Text Search เป็นฟีเจอร์ที่ทรงพลังของ PostgreSQL ที่ช่วยให้ค้นหาข้อความจำนวนมากได้อย่างรวดเร็วและยืดหยุ่น การใช้ tsvector
, tsquery
ร่วมกับ GIN Index จะช่วยเพิ่มประสิทธิภาพอย่างมาก เหมาะสำหรับระบบที่ต้องการการค้นหาข้อความ เช่น Blog, CMS, E-commerce
SEO Keywords
PostgreSQL Full Text Search,tsvector tsquery,PostgreSQL GIN Index,Full Text Search Ranking,Full Text Search Highlight,Postgres Search Example,การทำ Full Text Search