FTS desteklemiyor LIKE
Daha önce kabul cevap yanlış. Tam Metin Arama tam metin dizinleri ile değil için LIKE
kendi operatörleri vardır ve keyfi dizeleri için çalışmaz, hiç operatör. Sözlüklere ve kök oluşturmaya dayalı sözcükler üzerinde çalışır . Bu does destek kelimeler için önek eşleşmesini ile değil, LIKE
operatör:
Trigram dizinleri LIKE
Yalnızca sola bağlı olanları değil tüm modelleri ve modelleri desteklemek pg_trgm
için GIN ve GiST trigram dizinleri için operatör sınıfları sağlayan ek modülü kurun :LIKE
ILIKE
Örnek dizin:
CREATE INDEX tbl_col_gin_trgm_idx ON tbl USING gin (col gin_trgm_ops);
Veya:
CREATE INDEX tbl_col_gist_trgm_idx ON tbl USING gist (col gist_trgm_ops);
Örnek sorgu:
SELECT * FROM tbl WHERE col LIKE '%foo%'; -- leading wildcard
SELECT * FROM tbl WHERE col ILIKE '%foo%'; -- works case insensitively as well
Trigram? Daha kısa dizeler ne olacak?
Dizine alınmış değerlerde 3'ten az harf içeren sözcükler hala çalışır. Kullanım kılavuzu:
Dizede bulunan trigram kümesini belirlerken, her sözcüğün önünde iki boşluğa ve son eklenmiş bir boşluğa sahip olduğu kabul edilir.
Ve 3 harften az arama kalıpları? Kullanım kılavuzu:
Hem LIKE
ve hem de normal ifade aramaları için, çıkarılabilir trigramları olmayan bir modelin tam dizin taramasına dönüşeceğini unutmayın.
Yani, bu dizin / bitmap dizini taramaları hala çalışır (hazırlanmış deyim için sorgu planları bozulmaz), size daha iyi performans sağlamaz. Tipik olarak büyük bir kayıp olmaz, çünkü 1 veya 2 harfli dizeler pek seçici değildir (temel tablo eşleşmelerinin yüzde birkaçından fazlası) ve dizin desteği, başlangıçta performansı iyileştirmez, çünkü tam bir tablo taraması daha hızlıdır.
text_pattern_ops
önek eşleşmesi için
Yalnızca sola bağlantılı desenler için (önde gelen joker karakter yok) , bir btree dizini için uygun bir operatör sınıfıyla optimum olanı elde edersiniz: text_pattern_ops
veya varchar_pattern_ops
. Standart Postgres'in her iki yerleşik özelliği de ek modül gerekmez. Benzer performans, ancak çok daha küçük indeks.
Örnek dizin:
CREATE INDEX tbl_col_text_pattern_ops_idx ON tbl(col text_pattern_ops);
Örnek sorgu:
SELECT * FROM tbl WHERE col LIKE 'foo%'; -- no leading wildcard
Veya , veritabanınızı 'C' yerel ayarıyla çalıştırmanız gerekiyorsa (etkin bir şekilde yerel ayar yok ), o zaman her şey yine de bayt sırasına göre sıralanır ve varsayılan operatör sınıfına sahip düz bir btree dizini işi yapar.
Dba.SE'deki bu ilgili cevaplarda daha fazla ayrıntı, açıklama, örnekler ve bağlantılar: