FTS tidak mendukung LIKE
Jawaban yang diterima sebelumnya salah. Pencarian Teks Lengkap dengan indeks teks lengkapnya tidak untuk LIKE
operator sama sekali, ia memiliki operatornya sendiri dan tidak berfungsi untuk string yang berubah-ubah. Ini beroperasi pada kata berdasarkan kamus dan stemming. Itu memang mendukung pencocokan awalan untuk kata , tetapi tidak dengan LIKE
operator:
- Dapatkan kecocokan sebagian dari kolom TSVECTOR yang diindeks GIN
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 ke 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);
- Perbedaan antara indeks GiST dan GIN
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 dengan kurang dari 3 huruf dalam nilai yang diindeks masih berfungsi. Panduan:
Setiap kata dianggap memiliki dua spasi awalan dan satu spasi saat menentukan himpunan trigram yang terkandung dalam string.
Dan pola pencarian dengan kurang dari 3 huruf? Panduan:
Untuk keduanya
LIKE
dan pencarian ekspresi reguler, perlu diingat bahwa pola tanpa trigram yang dapat diekstrak akan berubah menjadi pemindaian 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 dari tabel yang mendasari cocok) dan dukungan indeks tidak akan meningkatkan kinerja untuk memulai, karena pemindaian tabel penuh lebih cepat.
text_pattern_ops
untuk pencocokan awalan
Hanya untuk berlabuh ke kiri pola (tidak ada 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 'C' lokal (secara efektif tidak locale), maka semuanya diurutkan menurut urutan byte dan indeks btree biasa dengan kelas operator default melakukan pekerjaan itu.
Detail lebih lanjut, penjelasan, contoh, dan tautan dalam jawaban terkait ini di dba.SE:
- Pencocokan pola dengan LIKE, SIMILAR TO, atau ekspresi reguler di PostgreSQL
- Bagaimana LIKE diterapkan?
- Menemukan string serupa dengan PostgreSQL dengan cepat