PostgreSQL มี full-text search ในตัว — ค้นหาเอกสาร/ข้อความหาคำพร้อม stemming, การจัดอันดับ และการรับรู้ภาษา ทรงพลังกว่า LIKE มาก มันใช้ชนิด tsvector (เอกสารที่ประมวลผลแล้ว) และ tsquery (query การค้นหา) พร้อม GIN indexes เพื่อความเร็ว
PostgreSQL มี full-text search ในตัว — ค้นหาเอกสาร/ข้อความหาคำพร้อม stemming, การจัดอันดับ และการรับรู้ภาษา ทรงพลังกว่า LIKE มาก มันใช้ชนิด tsvector (เอกสารที่ประมวลผลแล้ว) และ tsquery (query การค้นหา) พร้อม GIN indexes เพื่อความเร็ว
LIKE '%word%' → no stemming (won't match "running" for "run"), no ranking, no language
awareness, and can't use an index well (leading wildcard) → slow and limited.
Full-text search → stems words, ignores stop words, ranks by relevance, indexable.
-- to_tsvector — process text into searchable lexemes (stemmed, stop-words removed)
SELECT to_tsvector('english', 'The cats are running fast');
-- → 'cat':2 'fast':5 'run':4 (stemmed: cats→cat, running→run; "the"/"are" removed)
-- to_tsquery / plainto_tsquery — parse a search query
SELECT to_tsvector('english', body) @@ to_tsquery('english', 'running')
FROM articles; -- @@ = the match operator; matches "run" stem
to_tsvector แปลงข้อความเป็น lexemes ที่ normalize แล้ว (stem คำ, ลบ stop words) และ to_tsquery parse คำค้นหา operator @@ ทดสอบการ match ดังนั้น "running" จึง match เอกสารที่มี "run," "runs" ฯลฯ
-- add a generated tsvector column and index it with GIN
ALTER TABLE articles ADD COLUMN search_vector tsvector
GENERATED ALWAYS AS (to_tsvector('english', title || ' ' || body)) STORED;
CREATE INDEX idx_search ON articles USING GIN (search_vector);
-- fast searches using the index
SELECT title FROM articles
WHERE search_vector @@ plainto_tsquery('english', 'machine learning');
SELECT title, ts_rank(search_vector, query) AS rank
FROM articles, plainto_tsquery('english', 'database') query
WHERE search_vector @@ query
ORDER BY rank DESC; -- most relevant first
ts_rank ให้คะแนนว่าแต่ละเอกสาร match ได้ดีเพียงใด ช่วยให้จัดลำดับผลลัพธ์ตามความเกี่ยวข้องได้
full-text search ในตัวของ PostgreSQL เป็นความสามารถที่มีคุณค่าซึ่งช่วยให้คุณนำ ฟังก์ชันการค้นหาภายในฐานข้อมูลของคุณ ไปใช้ได้ โดยไม่ต้องใช้ search engine แยก (เช่น Elasticsearch) สำหรับหลายกรณีใช้งาน ดังนั้นการเข้าใจมันจึงมีประโยชน์สำหรับแอปพลิเคชันที่ต้องการการค้นหาข้อความ
คุณค่าหลักคือมันทรงพลังกว่า LIKE มาก (ซึ่ง stem คำ, จัดอันดับผลลัพธ์ หรือ index อย่างมีประสิทธิภาพไม่ได้): full-text search ให้ การ stem คำ (match "running" สำหรับ "run"), การลบ stop words, การรับรู้ภาษา, การจัดอันดับตามความเกี่ยวข้อง และที่สำคัญคือ index ได้ (ด้วย GIN indexes เพื่อการค้นหาที่เร็ว) ส่งมอบความสามารถการค้นหาจริง (แบบที่ผู้ใช้คาดหวัง: match รูปแบบคำที่ผันแปร, จัดอันดับตามความเกี่ยวข้อง) ได้โดยตรงใน Postgres
การเข้าใจแนวคิดหลัก — tsvector (ข้อความเอกสารที่ประมวลผลและ stem แล้ว), tsquery (คำค้นหาที่ parse แล้ว), operator การ match @@ และ ts_rank สำหรับการจัดอันดับตามความเกี่ยวข้อง — บวกกับการตั้งค่าในทางปฏิบัติ (คอลัมน์ tsvector แบบ generated ที่ index ด้วย GIN เพื่อ performance) ครอบคลุมวิธีนำการค้นหาที่มีประสิทธิภาพไปใช้
แม้ว่า search engine เฉพาะทางจะให้มากกว่าสำหรับความต้องการที่ซับซ้อน แต่ full-text search ของ Postgres เพียงพอและสะดวกสำหรับหลายแอปพลิเคชัน (หลีกเลี่ยงความซับซ้อนเชิงปฏิบัติการของระบบค้นหาแยก และรักษาข้อมูลค้นหาให้สอดคล้องกับข้อมูล relational ของคุณ)
เนื่องจากการค้นหาข้อความเป็นข้อกำหนดที่พบบ่อยของแอปพลิเคชัน และเนื่องจาก Postgres ให้ full-text search ในตัวที่มีความสามารถ (ทรงพลัง, index ได้, มี stemming และการจัดอันดับ) ซึ่งมักเพียงพอโดยไม่ต้องใช้ search engine แยก การเข้าใจมัน — โมเดล tsvector/tsquery, การตั้งค่าที่ index และการจัดอันดับ — จึงเป็นความรู้ที่มีคุณค่าและนำไปใช้ได้จริงซึ่งช่วยให้คุณเพิ่มฟังก์ชันการค้นหาจริงโดยใช้ความสามารถในตัวของ PostgreSQL เป็นความสามารถที่มีประโยชน์ที่มักถูกมองข้ามไปหาทางออกภายนอกที่ซับซ้อนกว่าทั้งที่ Postgres ก็เพียงพอ