การค้นหาข้อความเต็มด้วย tsvector และ GIN
สร้างระบบค้นหาข้อความเต็มสำหรับใช้งานจริงด้วยคอลัมน์ tsvector ดัชนี GIN และพจนานุกรมค้นหาข้อความที่กำหนดค่าได้
การค้นหาข้อความเต็มด้วย tsvector และ GIN เป็นบทเรียน SQL Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน SQL Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส SQL Academy มีบทเรียนทั้งหมด 4 บทเรียน
ก้าวข้ามการค้นหาสตริงย่อย: การค้นหาที่เข้าใจคำ
การค้นหาข้อความเต็มรูปแบบ (FTS) เข้าใจคำต่าง ๆ ได้แก่ การตัดคำลงรากศัพท์ คำหยุด และการจัดอันดับ PostgreSQL มีความสามารถนี้ในตัวผ่านชนิด tsvector / tsquery
สร้าง tsvector
แยกวิเคราะห์เอกสาร:
SELECT to_tsvector('english', 'The quick brown foxes jumped over');
-- 'brown':3 'fox':4 'jump':5 'quick':2สร้าง tsquery
แยกวิเคราะห์คิวรี:
SELECT to_tsquery('english', 'fox & jumping'); -- 'fox' & 'jump'
SELECT websearch_to_tsquery('english', 'fox jumping -lazy');จับคู่: @@
ทดสอบเอกสารกับคิวรี:
SELECT 'fox jumping'::tsvector @@ 'fox & jump'::tsquery; -- tการทำดัชนีสำหรับ FTS
เพิ่มคอลัมน์ tsvector และดัชนี GIN:
ALTER TABLE articles
ADD COLUMN search_doc tsvector
GENERATED ALWAYS AS (
to_tsvector('english', coalesce(title,'') || ' ' || coalesce(body,''))
) STORED;
CREATE INDEX articles_search_idx ON articles USING GIN (search_doc);การคิวรี
การค้นหาที่กรองอย่างรวดเร็ว:
SELECT id, title FROM articles
WHERE search_doc @@ websearch_to_tsquery('english', 'postgres performance')
ORDER BY ts_rank(search_doc, websearch_to_tsquery('english', 'postgres performance')) DESC
LIMIT 20;การจัดอันดับด้วย ts_rank
ts_rank ให้คะแนนผลลัพธ์ตามความถี่และตำแหน่งของคำ ส่วน ts_rank_cd ใช้ความหนาแน่นของการครอบคลุม (คำนึงถึงตำแหน่ง):
SELECT id, ts_rank_cd(search_doc, q) AS rank
FROM articles, websearch_to_tsquery('english', $1) AS q
WHERE search_doc @@ q
ORDER BY rank DESC LIMIT 20;ข้อมูลบางส่วนด้วย ts_headline
แสดงส่วนข้อความที่ตรงกัน โดยเน้นคำที่ตรงกัน:
SELECT ts_headline('english', body,
websearch_to_tsquery('english', $1),
'StartSel=<mark>, StopSel=</mark>, MaxFragments=2')
FROM articles
WHERE search_doc @@ websearch_to_tsquery('english', $1);การค้นหาวลี
ค้นหาคำที่อยู่ติดกัน:
SELECT * FROM articles
WHERE search_doc @@ phraseto_tsquery('english', 'database performance');การเพิ่มน้ำหนักหลายฟิลด์
ให้น้ำหนักชื่อเรื่องมากกว่าเนื้อหาโดยใช้ setweight:
ALTER TABLE articles
ADD COLUMN search_doc tsvector
GENERATED ALWAYS AS (
setweight(to_tsvector('english', coalesce(title,'')), 'A') ||
setweight(to_tsvector('english', coalesce(body,'')), 'B')
) STORED;การกำหนดค่าภาษา
การกำหนดค่า english ระบุคำหยุด การตัดคำลงรากศัพท์ และอื่น ๆ PostgreSQL มาพร้อมกับหลายภาษา คุณสามารถสลับภาษาตามต้องการได้:
SELECT to_tsvector('turkish', 'Veritabanı performansı');ข้อจำกัดของ FTS ในตัว
เหมาะสำหรับภาษาที่มีลักษณะคล้ายภาษาอังกฤษและการจัดอันดับพื้นฐาน หากต้องการความสามารถขั้นสูงขึ้น (BM25, เวกเตอร์ฝังความหมาย และการค้นหาแบบมีมิติข้อมูล) โปรดพิจารณาใช้ Elasticsearch หรือ OpenSearch ร่วมกับ Postgres
สรุปทบทวน
FTS ของ PostgreSQL เป็นตัวเลือกเริ่มต้นที่มีความสามารถครบถ้วน
- การจับคู่ด้วย tsvector + tsquery + @@
- ดัชนี GIN เพื่อความเร็ว
- websearch_to_tsquery สำหรับข้อมูลที่ผู้ใช้ป้อน
- ts_rank/ts_headline สำหรับผลลัพธ์ที่จัดอันดับและเน้นข้อความ
ตรวจสอบอย่างรวดเร็ว
คุณต้องกรองบทความอย่างรวดเร็วด้วยคิวรีข้อความเต็มรูปแบบ ควรใช้ดัชนีใด
คำถามที่พบบ่อย
บทเรียน “การค้นหาข้อความเต็มด้วย tsvector และ GIN” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “การค้นหาข้อความเต็มด้วย tsvector และ GIN” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส SQL Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส SQL Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “การค้นหาข้อความเต็มด้วย tsvector และ GIN”
สร้างระบบค้นหาข้อความเต็มสำหรับใช้งานจริงด้วยคอลัมน์ tsvector ดัชนี GIN และพจนานุกรมค้นหาข้อความที่กำหนดค่าได้ คุณปฏิบัติ SQL Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน SQL Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน SQL Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน
บทเรียน “การค้นหาข้อความเต็มด้วย tsvector และ GIN” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน SQL Academy นี้ได้ไหม
ได้ บทเรียน SQL Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- การค้นหาไตรแกรม (pg_trgm) เพื่อการจับคู่แบบคลุมเครือ
- การค้นหาข้อความเต็มด้วย tsvector และ GIN
- การสร้างดัชนีเชิงภูมิสารสนเทศด้วย PostGIS
- การค้นหาเวกเตอร์ด้วย pgvector