pg_trgm modülü, geliştiricilerinin deyimiyle, metinlerin benzerliğini sorgulamak için fonksiyonlar ve operatörler sunmasının yanı sıra benzer stringlerin hızlıca aranabilmesi için index operatör sınıfları da sunar.
pg_trgm modülü contrib paketinde yer alır. Modülü etkin hale getirmek için aşağıdaki SQL sorgusunu çalıştırmanız yeterlidir.
pg_trgm modülünün çalışma ilkesi trigramlara dayanır. Trigram, bir string içerisindeki ardışık 3 karaktere verilen addır. Modül, iki stringin benzerliğini içerdikleri ortak trigramların sayısına göre hesaplar. Bu yöntem doğal diller için oldukça başarılıdır ki buna Türkçe de dahildir. Trigramlar hesaplanmadan önce stringin önünde iki boşluk, sonunda da bir boşluk olduğu kabul edilir. Böylece fehmi stringinin trigramları ' f', ' fe', 'feh', 'ehm', 'hmi', 'mi ' olur.
Yukarıda pg_trgm modülünün bazı fonksiyonlar ve operatörler sunduğundan bahsetmiştim. Şimdi bu fonksiyonlara ve operatörlere göz atalım.
pg_trgm modülü yüksek hızlı benzerlik araması için text alanlar üzerinde GIN ve GIST türünden index operatör sınıfları sağlıyor. Modülün sağladığı bu index desteği ile PostgreSQL 9.1 sürümünden itibaren LIKE sorgularımızı da hızlandırabiliyoruz. Aşağıda hem GIN hem de GIST türünden pg_trgm index oluşturma örneği yer alıyor.
Bir yanlış anlaşılmaya mahal vermeden belirtmek isterim ki bu indexler varchar türünden alanlar üzerinde de oluşturulabilirler. Oluşturduğumuz indexi kullanarak benzerlik araması yapmak için aşağıdaki gibi bir sorgu yazabiliriz.
Yukarıdaki sorgu fehmi stringine benzer olan stringleri ve benzerlik puanlarını, benzerlik puanına göre azalan olarak getirir. Böylece 'fehmi' stringine en benzer olan stringler en üstte yer alırlar. Aynı sorguyu uzaklık puanı operatürünü(<->) kullanarak aşağıdaki gibi de yazabilirdik.
LIKE sorgularında oluşturduğumuz indexin kullanılması için ayrıca bir işlem yapmamız gerekmiyor. Aşağıdaki gibi bir sorgu yazdığımızda pg_trgm indexi devreye giriyor ve sorgunun daha hızlı çalışmasını sağlıyor.
Bir dip not da GIN ve GIST index türleri için vereyim. GIN indexler GIST indexlere göre daha hızlı aranabilirler ancak oluşturulma ve güncelleme maliyetleri daha yüksektir. Bu sebeple çok sık güncellenen tablolarda GIST indexler daha avantajlı olabilir. Ancak statik ya da çok sık değişmeyen tablolar için GIN indexlerin arama performansından faydanılmalıdır.
Follow me on Twitter