FTS tidak mendukung LIKE
The jawaban yang diterima sebelumnya tidak benar. Pencarian Teks Lengkap dengan indeks teks lengkapnya sama sekali bukan untuk LIKE
operator, ia memiliki operator sendiri dan tidak berfungsi untuk string arbitrer. Ini beroperasi pada kata-kata berdasarkan kamus dan stemming. Ini tidak mendukung awalan yang cocok untuk kata-kata , tetapi tidak dengan LIKE
Operator:
Indeks trigram untuk LIKE
Instal modul tambahan pg_trgm
yang menyediakan kelas operator untuk indeks trigram GIN dan GiST untuk mendukung semua LIKE
dan ILIKE
pola , bukan hanya yang berlabuh kiri:
Contoh indeks:
CREATE INDEX tbl_col_gin_trgm_idx ON tbl USING gin (col gin_trgm_ops);
Atau:
CREATE INDEX tbl_col_gist_trgm_idx ON tbl USING gist (col gist_trgm_ops);
Contoh kueri:
SELECT * FROM tbl WHERE col LIKE '%foo%'; -- leading wildcard
SELECT * FROM tbl WHERE col ILIKE '%foo%'; -- works case insensitively as well
Trigram? Bagaimana dengan string yang lebih pendek?
Kata-kata dengan kurang dari 3 huruf dalam nilai yang diindeks masih berfungsi. Manualnya:
Setiap kata dianggap memiliki dua spasi diawali dan satu spasi saat menentukan himpunan trigram yang terdapat dalam string.
Dan pola pencarian dengan kurang dari 3 huruf? Manualnya:
Baik untuk LIKE
pencarian ekspresi reguler maupun regular, perlu diingat bahwa pola tanpa trigram yang dapat diekstrak akan merosot menjadi scan indeks penuh.
Artinya, pemindaian indeks indeks / bitmap masih berfungsi (rencana kueri untuk pernyataan yang disiapkan tidak akan rusak), itu tidak akan memberi Anda kinerja yang lebih baik. Biasanya tidak ada kerugian besar, karena string 1 atau 2 huruf hampir tidak selektif (lebih dari beberapa persen kecocokan tabel yang mendasarinya) dan dukungan indeks tidak akan meningkatkan kinerja untuk memulai, karena pemindaian tabel lengkap lebih cepat.
text_pattern_ops
untuk pencocokan awalan
Untuk pola jangkar kiri saja (tanpa wildcard terkemuka) Anda mendapatkan yang optimal dengan kelas operator yang sesuai untuk indeks btree: text_pattern_ops
atau varchar_pattern_ops
. Kedua fitur bawaan Postgres standar, tidak diperlukan modul tambahan. Performa serupa, tetapi indeks jauh lebih kecil.
Contoh indeks:
CREATE INDEX tbl_col_text_pattern_ops_idx ON tbl(col text_pattern_ops);
Contoh kueri:
SELECT * FROM tbl WHERE col LIKE 'foo%'; -- no leading wildcard
Atau , jika Anda harus menjalankan database Anda dengan lokal 'C' (secara efektif tidak ada lokal), maka semuanya akan disortir menurut urutan byte dan indeks btree biasa dengan kelas operator default melakukan tugasnya.
Lebih detail, penjelasan, contoh dan tautan dalam jawaban terkait ini di dba.SE: