Merhaba. Django modellerimiz üzerinde arama yaparken PostgreSQL tarafından sunulan bazı metotları görelim. Tabi bu metotları kullanabilmek için PostgreSQL kurulu olmalı ve Python tarafında "psycopg2-binary" paketini kurmalısınız.
Ve daha sonra Django projenizde INSTALLED_APPS içerisine şunu eklemelisiniz;
Django tarafından tüm veritabanları için sunulan full-text-search araçları yeterli gelir çoğunlukla. Ancak bazen veritabanına özgü arama özelliklerini kullanmak isteyebiliriz. Örneğin vektörel arama, benzer oranı belirli bir değerden yüksek olanları arama gibi. Bu tarz aramalar, genelde web sitelerinde bulunan arama kutusunda kullanıcının yazdığı kelimelere yakın sözcükleri kullanıcıya önerip, kısa sürede sonuca ulaşmasını sağlamaktır. Tabi bunun bir bedeli vardır, zaman gibi. Bu öneriler bir algoritma yardımıyla yapılır. Bu sebeple daha spesifik verileri elde etmek istediğimizde harcanan süre de artabilir.
SearchVector
İlk olarak SearchVector ile başlayalım. Bu sınıf, django.contrib.postgres.search altında yer alır. Amacı tek bir field üzerinde değil, birden fazla field üzerinde arama yapmaktır. Elinizde kitap modelleri olduğunu düşünün. Kullanıcıya tek bir arama kutusu içerisinde hem yazar adı, hem de kitap adı ile arama yapabilme imkanı verebilirsiniz. Veya ürün modeline sahip olduğunuzu düşünün. Kullanıcı bir ürünü aramak istediğinde belki belirli bir markayı, belki de ürünün adını yazacaktır. Böyle bir aramayı tek field ile sınırlandıramayız. İşte SearchVector ile birden fazla field üzerinde sorgumuzu gerçekleştirebiliriz. Kullanımı şöyledir.
Kullanıcı Selpak araması yaptığında, Selpak ile alakalı marka ve ürünleri getirmiş olacaktır.
SearchQuery
Aslında SearchQuery tek başına değil, diğer arama sınıflarıyla birleştirilerek kullanılır. Aramak istediğiniz ifadeyi SearchQuery ile hazırlarsınız ve sonra da arama sınıflarından birisine parametre olarak verirsiniz. Ne demek istediğimi bir sonraki arama sınıfın incelerken anlayacaksınız.
Önce bu sınıfı biraz tanıyalım. İlk olarak, hiç bir parametre vermeden sorguyu direkt olarak geçirirseniz bu sorguyu vector haline getirecektir. Mesela "yeşil biber" ve "biber yeşil" ifadesi aynı şeyi ifade eder çünkü ifademiz "yeşil", "biber" şeklinde parçalara ayrılacaktır.
Ancak sorgunuzun tek bir biçimde ele alınmasını isterseniz search_type="phrase" parametresini geçmeniz gerekir. Böylece "yeşil biber" ve "biber yeşil" ifadeleri birbirinden farklı hale gelmiş olur.
Dilerseniz, aramak istediğiniz ifadeyi bool olarak tanımlayabilirsiniz. Belki biber yeşil veya kırmızı olsun demek istiyor olabilirsiniz. O halde search_type="raw" parametresini geçmeniz gerekir. Ve ifademizde şöyle olmalı; Burada kısaca, yeşil veya kırmızı biber araması yapmak istediğimizi ifade ediyoruz. Bu ifadeyi, diğer arama sınıfları içerisinde kullanabiliriz.
SearchRank
Şimdi PostgreSQL tarafından sunulan, direkt aradığımız sonucun yanında oransal olarak daha alakalı sonuçları da veren bir sınıfı inceleyelim. Basit bir şekilde kullanımı şöyledir:
İstenirse, aramanın yapılacağı sütunlara ağırlık verilebilir. Yani kullanıcının girdiği arama ifadesi ağırlıklı olarak belirli bir sütunla ilişkilendirilebilir. Mesela kullanıcıların genelde ürün adını yazdıkları bir sitede ağırlığı ürün adı sütununa vermek iyi bir seçenek olabilir.
TrigramSimilarity
Bazen kullanıcı ürün adını yanlış, eksik veya fazla yazabilir. Bu durumda yazılan ifadeye en yakın olan ürünleri sunmak gerekebilir. PostgreSQL tarafından sunulan TrigramSimilarity bu amaçla kullanılabilir. Aranan ifade ile belirli bir oranın üstünde eşleşen sonuçları döndürebiliriz. Örneğin:
Böylece "bibeer" şeklinde yanlış yazılmış olsa bile TrigramSimilarity sınıfının uyguladığı algoritma ile en alakalı ve 0.3 oranından yüksek sonuçlar liste olarak sunulacaktır.
Kısaca PostgreSQL ile kullanılabilecek arama sınıflarını, metotlarını kendime notlar biçiminde yazmak istedim. Eksiklikler var, zaman buldukça güncelleyeceğim. Görüşmek üzere.
Yorumlar
Yorum Gönder