ในฐานะ Senior Architect ด้านระบบข้อมูล การสร้างระบบค้นหา (Search Engine) ที่มีประสิทธิภาพสูงเทียบเท่ากับ Google นั้น ไม่ได้หมายถึงการสร้าง Crawler แต่หมายถึงการจัดการและดึงข้อมูลที่เกี่ยวข้องได้อย่างรวดเร็วและแม่นยำ หัวใจสำคัญของระบบนี้คือการทำ Full-Text Search (FTS) ซึ่ง PostgreSQL มีความสามารถนี้ในตัว ทำให้เราสามารถใช้ PostgreSQL เป็น Backend หลักในการขับเคลื่อนฟังก์ชันการค้นหาที่ซับซ้อนได้โดยไม่ต้องพึ่งพาเครื่องมือภายนอก
💡 Full-Text Search (FTS) ใน PostgreSQL คืออะไร?
การค้นหาแบบพื้นฐานด้วยคำสั่ง WHERE content LIKE '%keyword%' นั้นมีข้อจำกัดอย่างมาก เพราะมันไม่เข้าใจความสัมพันธ์ของคำ (Stemming), การตัดคำ (Tokenization), หรือการจัดลำดับความสำคัญของคำ (Relevance Scoring) PostgreSQL’s FTS เข้ามาแก้ปัญหานี้โดยการแปลงข้อความธรรมดาให้เป็นรูปแบบที่เครื่องมือค้นหาเข้าใจ (tsvector) และใช้คำสั่ง to_tsquery เพื่อสอบถามด้วยคำที่ถูกวิเคราะห์แล้ว
🛠️ การใช้งาน FTS: การสร้างและค้นหาข้อมูล
ขั้นตอนแรกคือการสร้างตารางและใส่ข้อมูลตัวอย่าง จากนั้นเราจะใช้ฟังก์ชัน to_tsvector เพื่อสร้าง Index ของเนื้อหา และใช้ @@ operator ในการค้นหา:
SQL
-- 1. สร้างตารางสำหรับเก็บเอกสาร
CREATE TABLE documents (
id SERIAL PRIMARY KEY,
content TEXT
);
-- 2. ใส่ข้อมูลตัวอย่าง (ใช้สตริงสั้นตามข้อกำหนด)
INSERT INTO documents (content) VALUES
('apple banana orange'),
('red apple fruit'),
('banana kiwi orange');
-- 3. ทำการค้นหา: ค้นหาคำว่า 'apple' และ 'banana' พร้อมจัดอันดับความเกี่ยวข้อง (ts_rank)
SELECT
id,
content,
ts_rank(to_tsvector('english', content), to_tsquery('english', 'apple banana')) AS rank
FROM documents
WHERE to_tsvector('english', content) @@ to_tsquery('english', 'apple banana')
ORDER BY rank DESC;
🚀 การยกระดับประสิทธิภาพ: การจัดอันดับ (Ranking)
ความเหนือกว่าของ FTS คือการที่เราสามารถคำนวณคะแนนความเกี่ยวข้อง (Relevance Score) ได้ด้วยฟังก์ชัน ts_rank ซึ่งจะช่วยให้เราจัดเรียงผลลัพธ์ที่ใกล้เคียงกับคำค้นหาของผู้ใช้มากที่สุดขึ้นมาอยู่ลำดับแรกๆ เสมือนการทำงานของ Search Engine ระดับโลก การใช้ ts_rank นี้จึงเป็นกุญแจสำคัญในการออกแบบระบบค้นหาที่ User Experience ดีเยี่ยม
✅ บทสรุป
การผสานพลังของ PostgreSQL เข้ากับ Full-Text Search ทำให้เราสามารถสร้างระบบค้นหาที่มีความซับซ้อนและประสิทธิภาพสูงได้ด้วย SQL เพียงอย่างเดียว โดยไม่ต้องพึ่งพา Microservice ภายนอก การทำความเข้าใจการทำงานของ tsvector และ ts_rank จะช่วยให้คุณสามารถออกแบบ Backend สำหรับการค้นหาที่แข็งแกร่งและขยายขนาดได้ (Scalable) อย่างแท้จริง