Ana içeriğe atla

Django PostgreSQL Full Text Search

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

Bu blogdaki popüler yayınlar

Python Soket Programlama

Merhaba arkadaşlar. Bugün sizlerle birlikte Python'da socket programlama yapacağız. Bunun için Python da socket kütüphanesini kullanacağız. Peki nedir bu socket programlama? Soket programlama, sizin iki program arası yada iki bilgisayar arası iletişim kurmanızı sağlar. İşte bizde bugün iki programımızı birbiri ile haberleştireceğiz. Bunun için elimizde iki program olacak. Birinci program,mesaj bekleyen program olacak, diğeri ise mesaj gönderen program.

Python Subprocess

subprocess modülü, yeni bir process oluşturmayı sağlayan, bunların girdi-çıktılarını ele alma imkânı veren ve dönüş kodlarını almayı sağlayan bir modüldür. Yani daha basit bir şekilde, program içinde program çalıştırmaya imkan veren bir modüldür. Subprocess Modülünün Kullanımı subprocess basit bazı process'leri kullanmak için birkaç tane fonksiyon sunuyor. Daha karmaşık bir process çalıştırmak isterseniz, Popen sınıfını kullanabilirsiniz. Bunlara detaylı bir şekilde değinmeye çalışacağız. Şimdi basit fonksiyonları inceleyelim

Infix to postfix dönüşümü

Infix to postfix dönüşümü, operatorün ortada olduğu a+b yazım şeklini operatorün sonda olduğu ab+ yazım şekline dönüştürme işlemidir.  Infix gösterimi, bizler için kolay bir gösterim olsa da makineler için öyle değildir. İfadeyi soldan sağa doğru okurken a + b * c işleminde önce b ile c yi çarpıp sonra da a ile toplamayı kolay bir şekilde yapabiliriz çünkü bizim ifadeyi sıra ile soldan sağa adım adım giderek okuma zorunluluğumuz yok. Önce b*c nin öncelikle olduğunu görerek oradan başlar, sonra a ile kolayca toplarız.