Bloga Dön
Web Geliştirme

Web Sitesine Arama Özelliği Nasıl Eklenir?

Web sitesine arama özelliği nasıl eklenir? Veritabanı tam metin araması mı arama motoru mu, Türkçe karakter ve yazım hatası sorunu, sonuç sıralaması, sıfır sonuç raporu ve sık yapılan hatalar.

Site İçi AramaWeb GeliştirmePostgreSQLE-ticaret

Web sitesine arama özelliği eklemenin doğru yolu, önce ne aranacağını ve kaç kayıt üzerinde aranacağını netleştirmektir. Birkaç bin sayfa ya da ürünlük bir sitede veritabanının kendi tam metin araması (örneğin PostgreSQL) yeterlidir; çok sayıda filtre, anlık öneri ve büyük katalog söz konusuysa ayrı bir arama motoru (Elasticsearch, OpenSearch, Meilisearch, Typesense ya da Algolia gibi) devreye girer. Hangisini seçerseniz seçin asıl iş aynıdır: Türkçe karakterleri ve yazım hatalarını tolere etmek, sonuçları anlamlı sıralamak ve sonuç bulunamayan aramaları ölçmek.

Site içi arama neden basit bir LIKE sorgusu değildir?

İlk akla gelen çözüm, arama kutusuna yazılanı veritabanında "içeriyor mu" diye aramaktır. Bu yöntem küçük bir tabloda çalışıyor gibi görünür ama kullanıcının gerçekte yazdığı şeyleri karşılamaz:

  • Türkçe karakter: kullanıcı "cicek" yazar, kayıt "çiçek" olarak durur; büyük-küçük harf dönüşümünde I/ı ve İ/i ayrıca sorun çıkarır.
  • Ek ve çekim: "ayakkabılar" araması "ayakkabı" kaydını bulmalıdır.
  • Yazım hatası: "ayakabı" yazan kullanıcı boş sayfa görmemelidir.
  • Sıralama: "içeriyor" sorgusu eşleşenleri döndürür ama hangisinin daha alakalı olduğunu söylemez; başlıkta geçen kelime açıklamada geçenden önde olmalıdır.
  • Performans: baştan joker karakterli "içeriyor" sorgusu standart indeksi kullanamaz, kayıt sayısı büyüdükçe her aramada tüm tablo taranır.

Veritabanı araması mı, ayrı arama motoru mu?

Karar teknoloji tercihinden çok ihtiyaç listesine bağlıdır. Kurumsal sitelerin, blogların ve orta ölçekli kataloğların çoğunda mevcut veritabanı işi görür ve ek bir sistem işletmek gerekmez. Veritabanı seçimini PostgreSQL mi MySQL mi yazımızda ayrıca ele aldık; PostgreSQL tam metin araması ve benzerlik eklentisiyle bu senaryoda güçlü bir başlangıçtır.

  • Veritabanı araması yeterli: içerik sayısı sınırlı, filtreler az, sonuç sayfası birkaç saniyede değil anında dönüyor ve ekip ikinci bir sistemi işletmek istemiyor.
  • Arama motoru gerekli: büyük ürün kataloğu, çok sayıda filtre ve her filtrenin yanında sonuç adedi (facet), yazarken anlık öneri, eş anlamlı kelime yönetimi ve aramanın siteyi yavaşlatmaması gereken yoğun trafik.
  • Barındırılan arama hizmeti: işletme yükü sağlayıcıdadır ama kayıt ya da istek sayısına göre ücretlendirilir ve veri dışarıda tutulur; maliyeti ve KVKK tarafını baştan hesaplayın.
Arama motoru veritabanının yerini almaz, yanında durur. Asıl kayıt veritabanında kalır; arama indeksi ondan beslenen bir kopyadır ve kopyanın güncel tutulması projenin ayrı bir işidir.

PostgreSQL ile Türkçe tam metin araması örneği

Aşağıdaki örnek, aksan duyarsız arama için unaccent, yazım hatası toleransı için pg_trgm eklentisini kullanır. Önce tam metin eşleşmesine bakılır; sonuç yoksa benzerlik araması devreye girer. Başlık ağırlığı açıklamadan yüksek tutulur.

CREATE EXTENSION IF NOT EXISTS unaccent;
CREATE EXTENSION IF NOT EXISTS pg_trgm;

-- unaccent indeks ifadesinde kullanılabilsin diye IMMUTABLE sarmalayıcı
CREATE OR REPLACE FUNCTION f_unaccent(text) RETURNS text
  LANGUAGE sql IMMUTABLE PARALLEL SAFE
  AS $$ SELECT public.unaccent('public.unaccent', $1) $$;

ALTER TABLE products ADD COLUMN search_doc tsvector
  GENERATED ALWAYS AS (
    setweight(to_tsvector('turkish', f_unaccent(coalesce(name, ''))), 'A') ||
    setweight(to_tsvector('turkish', f_unaccent(coalesce(description, ''))), 'B')
  ) STORED;

CREATE INDEX products_search_idx ON products USING gin (search_doc);
CREATE INDEX products_name_trgm_idx ON products
  USING gin (f_unaccent(lower(name)) gin_trgm_ops);

-- 1) Tam metin araması, alaka puanına göre sıralı
SELECT id, name, ts_rank(search_doc, q) AS rank
FROM products,
     websearch_to_tsquery('turkish', f_unaccent($1)) AS q
WHERE search_doc @@ q
ORDER BY rank DESC
LIMIT 20;

-- 2) Sonuç yoksa: yazım hatasına toleranslı benzerlik araması
SELECT id, name
FROM products
WHERE f_unaccent(lower(name)) % f_unaccent(lower($1))
ORDER BY similarity(f_unaccent(lower(name)), f_unaccent(lower($1))) DESC
LIMIT 10;

Dikkat edilmesi gereken iki nokta var: lower() işlevinin I/ı dönüşümü veritabanının dil ayarına bağlıdır, bu yüzden Türkçe büyük harfli kayıtlarla mutlaka test edin; ve benzerlik eşiğini varsayılanda bırakmak yerine kendi verinizdeki gerçek aramalarla ayarlayın.

İyi bir arama deneyiminde neler olmalı?

  • Boş sonuç sayfası çıkmaz sokak olmamalı: benzer sonuçlar, popüler kategoriler ya da iletişim yolu gösterilmeli.
  • Arama terimi adres çubuğunda durmalı (?q=...); kullanıcı sonucu paylaşabilmeli, geri tuşu çalışmalı.
  • Filtreler sonuç sayısını göstermeli ve sıfır sonuç verecek seçenek sunulmamalı.
  • Mobilde arama kutusu ilk ekranda bulunmalı; klavye açıldığında sonuç alanı kapanmamalı.
  • Anlık öneri her tuşta değil, kısa bir bekleme (debounce) sonrasında istek atmalı; aksi hâlde sunucu boşuna yorulur.

Site içi arama SEO’yu nasıl etkiler?

Arama sonuç sayfaları Google’da indekslenmek için uygun değildir: sonsuz sayıda adres üretir ve ince içerik sayılır. Bu sayfalar noindex olarak işaretlenmeli, site haritasına eklenmemelidir. Buna karşılık site içi arama verisi SEO için değerli bir kaynaktır: kullanıcıların sitenizde aradığı ama bulamadığı her terim, yazılması gereken bir sayfa ya da eksik bir ürün demektir. Bu veriyi Google Analytics 4 üzerinde site araması olayı olarak toplayabilirsiniz. Arama sonuçlarının hızlı yüklenmesi de Core Web Vitals metriklerini doğrudan etkiler.

En değerli arama raporu en çok aranan kelimeler değil, sıfır sonuç dönen aramalardır. Her biri ya eksik bir içerik, ya eksik bir eş anlamlı, ya da eksik bir ürün demektir.

Sık yapılan hatalar

  • Arama indeksini yalnızca gece güncellemek: fiyatı ya da stoğu değişen ürün gün boyu yanlış görünür; değişiklik anında ya da kuyrukla güncellenmelidir.
  • Yayından kalkmış ya da yetki gerektiren içeriği indekse koymak: arama sonucu, sayfanın kendisinin göstermediği bilgiyi sızdırabilir.
  • Arama kutusunu hız sınırı olmadan açık bırakmak: botlar arama ucunu yorar; web sitesi güvenliği ilkeleri burada da geçerlidir.
  • Çok dilli sitede tek indeks kullanmak: her dil kendi dil kurallarıyla ayrı indekslenmelidir; ayrıntılar çok dilli web sitesi yazımızda.
  • Arama terimlerini kişisel veriyle birlikte süresiz saklamak: arama günlüğü de kişisel veri içerebilir, saklama süresi belirlenmelidir.

E-ticaret sitelerinde arama doğrudan satış kanalıdır; arama altyapısının maliyet kalemlerine e-ticaret sitesi kurma maliyeti yazımızda değindik. Bayilerin ürün koduyla hızlı sipariş verdiği B2B bayi sipariş sistemi gibi projelerde ise arama, ürün kodu ve barkod üzerinden tam eşleşmeyi öne almalıdır.

Sonuç

Web sitesine arama özelliği eklemek, bir arama kutusu koymaktan ibaret değildir: Türkçe karakteri ve yazım hatasını tolere eden, sonuçları alakaya göre sıralayan ve sıfır sonuç dönen aramaları raporlayan bir kurgu gerekir. Çoğu sitede veritabanının kendi tam metin araması yeterli bir başlangıçtır; katalog ve filtre ihtiyacı büyüdüğünde ayrı arama motoruna geçilir. Sitenize işe yarayan bir arama eklemek istiyorsanız web geliştirme hizmetimize göz atabilir ya da teklif alabilirsiniz.

Projenizi Hayata Geçirelim

Web sitesi, mobil uygulama veya kurumsal yazılım projeniz için ücretsiz danışmanlık alın.

Ücretsiz Teklif AlWeb Geliştirme hizmetimizi inceleyin