1. Çok Boyutlu (Faceted) Arama Neden Performansın Katilidir?
Bir müşteri ayakkabı kategorisine girdiğinde yalnızca ürünleri değil, sol taraftaki filtre panelinde şunları da görmek ister:
- Marka: Nike (142), Adidas (89), Puma (34)
- Numara: 41 (56), 42 (94), 43 (82)
- Renk: Siyah (112), Beyaz (85)
Kullanıcı "42 Numara" filtresine tıkladığı anda, diğer tüm filtrelerin (Marka ve Renk sayıları) yeni seçime göre anlık olarak yeniden hesaplanması gerekir. Acemi bir mimaride her filtre için ayrı bir COUNT(*) GROUP BY sorgusu çalıştırmak veritabanını felç eder.
2. Stilmerce Tekil Agregasyon (Single-Pass Aggregation) Modeli
Stilmerce, 5 farklı sorgu atmak yerine PostgreSQL'in FILTER (WHERE ...) ve JSON agregasyon özelliklerini kullanarak tüm facet sayılarını tek bir sorgu turunda (Single Round-Trip) hesaplar:
-- Tek Seferde Tüm Filtre Ağacını ve Ürünleri Döndüren Gelişmiş Sorgu
WITH filtered_products AS (
SELECT id, brand_id, price_cents, specs
FROM products
WHERE category_id = 'c111-222' AND is_active = true
)
SELECT
-- 1. Marka Dağılımı
jsonb_object_agg(brand_id, brand_count) AS brands,
-- 2. Fiyat Aralığı
MIN(price_cents) AS min_price,
MAX(price_cents) AS max_price
FROM (
SELECT brand_id, COUNT(*) AS brand_count
FROM filtered_products
GROUP BY brand_id
) sub;
Milisaniyelik Yanıt
Bu yöntem veritabanı üzerindeki disk okumalarını tek bir indekste birleştirir. 300.000 ürünlük bir kategoride filtre sayısı hesaplama süresi 850ms'den 12ms'ye düşer.
3. Akıllı Sıralama Algoritması: Alaka Düzeyi (Relevance) ve Stok Ağırlığı
Arama sonuçlarında yalnızca eşleşen kelimeye bakılmaz. Stokta kalmayan veya marjı düşük ürünleri en üstte göstermek satışları düşürür. Stilmerce sıralama motoru şu formülü uygular:
Skor = (Metin Eşleşme Skoru * 0.40) + (Stok Varlığı * 0.30) + (Popülerlik / Tıklama * 0.30)
Stokta tükenen ürünler arama sonuçlarının en sonuna otomatik olarak ötelenir; müşteriye her zaman hemen satın alabileceği ürünler sunulur.