FTS ไม่รองรับ LIKE
ตอบรับก่อนหน้านี้ไม่ถูกต้อง การค้นหาข้อความแบบเต็มพร้อมดัชนีข้อความแบบเต็มไม่ได้มีไว้สำหรับLIKE
โอเปอเรเตอร์ แต่อย่างใด แต่ก็มีตัวดำเนินการของตัวเองและใช้ไม่ได้กับสตริงที่กำหนดเอง มันทำงานโดยใช้คำตามพจนานุกรมและการสะกดคำ มันไม่สนับสนุนการจับคู่คำนำหน้าคำแต่ไม่ได้อยู่กับLIKE
ผู้ประกอบการ:
ดัชนี Trigram สำหรับ LIKE
ติดตั้งโมดูลเพิ่มเติมpg_trgm
ซึ่งจัดเตรียมคลาสตัวดำเนินการสำหรับดัชนีทริกเกอร์ GIN และ GiSTเพื่อรองรับรูปแบบและรูปแบบทั้งหมดLIKE
ILIKE
ไม่ใช่เฉพาะที่ยึดด้านซ้าย:
ตัวอย่างดัชนี:
CREATE INDEX tbl_col_gin_trgm_idx ON tbl USING gin (col gin_trgm_ops);
หรือ:
CREATE INDEX tbl_col_gist_trgm_idx ON tbl USING gist (col gist_trgm_ops);
ตัวอย่างแบบสอบถาม:
SELECT * FROM tbl WHERE col LIKE '%foo%'; -- leading wildcard
SELECT * FROM tbl WHERE col ILIKE '%foo%'; -- works case insensitively as well
Trigrams? แล้วสตริงที่สั้นกว่าล่ะ?
คำที่มีตัวอักษรน้อยกว่า 3 ตัวในค่าดัชนียังคงใช้ได้ คู่มือ:
แต่ละคำถือว่ามีช่องว่างสองช่องนำหน้าและมีช่องว่างหนึ่งช่องต่อท้ายเมื่อกำหนดชุดของตรีโกณมิติที่อยู่ในสตริง
และรูปแบบการค้นหาที่มีตัวอักษรน้อยกว่า 3 ตัว? คู่มือ:
สำหรับการค้นหาทั้งแบบLIKE
และนิพจน์ทั่วไปโปรดทราบว่ารูปแบบที่ไม่มีทริกเกอร์ที่แยกได้จะลดระดับลงเป็นการสแกนแบบเต็มดัชนี
หมายความว่าการสแกนดัชนีดัชนี / บิตแมปนั้นยังคงใช้งานได้ (แผนการสืบค้นสำหรับคำสั่งที่เตรียมไว้จะไม่หยุดทำงาน) มันจะไม่ทำให้คุณมีประสิทธิภาพที่ดีขึ้น โดยทั่วไปแล้วจะไม่มีการสูญเสียครั้งใหญ่เนื่องจากสตริง 1 หรือ 2 ตัวอักษรแทบจะไม่สามารถเลือกได้ (มากกว่าสองสามเปอร์เซ็นต์ของตารางที่ตรงกัน) และการรองรับดัชนีจะไม่ช่วยเพิ่มประสิทธิภาพในการเริ่มต้นเนื่องจากการสแกนแบบเต็มตารางทำได้เร็วขึ้น
text_pattern_ops
สำหรับการจับคู่คำนำหน้า
สำหรับรูปแบบที่ยึดด้านซ้ายเท่านั้น(ไม่มีสัญลักษณ์นำหน้า) คุณจะได้รับสิ่งที่ดีที่สุดด้วยคลาสตัวดำเนินการที่เหมาะสมสำหรับดัชนี btree: text_pattern_ops
หรือvarchar_pattern_ops
. ทั้งคุณสมบัติในตัวของ Postgres มาตรฐานไม่จำเป็นต้องมีโมดูลเพิ่มเติม ประสิทธิภาพใกล้เคียงกัน แต่ดัชนีเล็กกว่ามาก
ตัวอย่างดัชนี:
CREATE INDEX tbl_col_text_pattern_ops_idx ON tbl(col text_pattern_ops);
ตัวอย่างแบบสอบถาม:
SELECT * FROM tbl WHERE col LIKE 'foo%'; -- no leading wildcard
หรือถ้าคุณควรเรียกใช้ฐานข้อมูลของคุณด้วยโลแคล'C' ( ไม่มีโลแคลอย่างมีประสิทธิภาพ) ทุกอย่างจะถูกจัดเรียงตามลำดับไบต์ต่อไปและดัชนี btree ธรรมดาที่มีคลาสตัวดำเนินการเริ่มต้นจะทำงาน
รายละเอียดเพิ่มเติมคำอธิบายตัวอย่างและลิงค์ในคำตอบที่เกี่ยวข้องเหล่านี้บน dba.SE: