Full Text Search Uygulaması: Arama Motorunu Veritabanında Kodla

Veritabanında binlerce kayıt arasında saniyede sonuç bulmak için Full Text Search (FTS) kullan. PostgreSQL'in yerleşik FTS özelliği, karmaşık arama motorlarını basit hale getiriyor.

Problemi kısaca: Normal LIKE sorguları yavaş ve sınırlı. FTS, kelimeleri analiz eder, eşanlamlıları bulur ve çok daha hızlı arar.

Önce PostgreSQL'de tabloyu hazırla:

1CREATE TABLE makaleler (
2id SERIAL PRIMARY KEY,
3baslik VARCHAR(255),
4icerik TEXT,
5search_vector tsvector
6);
7
8CREATE INDEX idx_search ON makaleler USING GIN(search_vector);

Veri eklerken arama vektörünü otomatik güncelle:

Reklam · TEST
AdSense Test ReklamıYazı arası (gönderi içi) · Yazı arası
1CREATE TRIGGER update_search_vector
2BEFORE INSERT OR UPDATE ON makaleler
3FOR EACH ROW
4EXECUTE FUNCTION tsvector_update_trigger(
5search_vector, 'pg_catalog.turkish', baslik, icerik
6);

Python ile verileri ekle ve ara:

1import psycopg2
2from psycopg2.extras import execute_values
3
4conn = psycopg2.connect("dbname=arama user=postgres password=1234")
5cur = conn.cursor()
6
7# Veri ekle
8veri = [
9('Yapay Zeka Nedir', 'Yapay zeka bilgisayarların insan gibi düşünmesidir...'),
10('Veritabanı Optimizasyonu', 'Hızlı sorgular için indeksleme önemlidir...'),
11]
12
13execute_values(cur,
14"INSERT INTO makaleler (baslik, icerik) VALUES %s",
15veri
16)
17conn.commit()
18
19# Tam metin araması yap
20arama_terimi = "yapay zeka"
21cur.execute("""
22SELECT baslik, icerik,
23ts_rank(search_vector, plainto_tsquery('turkish', %s)) as skor
24FROM makaleler
25WHERE search_vector @@ plainto_tsquery('turkish', %s)
26ORDER BY skor DESC
27LIMIT 10
28""", (arama_terimi, arama_terimi))
29
30sonuclar = cur.fetchall()
31for baslik, icerik, skor in sonuclar:
32print(f"{baslik} (Skor: {skor:.2f})")
33print(f"{icerik[:100]}...\n")
34
35cur.close()
36conn.close()

Beklenen çıktı:

1Yapay Zeka Nedir (Skor: 0.30)
2Yapay zeka bilgisayarların insan gibi düşünmesidir...

Sık yapılan hata: `plainto_tsquery` yerine basit `to_tsquery` kullanmak. Bu, operatör hatası verir. Türkçe dil desteği için `'turkish'` parametresini unutma. Büyük verilerde GIN indeksi performansı 100 kez arttırır.

Reklam · TEST
AdSense Test ReklamıGönderi altı · Görüntülü
konu hakkında tepkinizi verebilirsiniz