# Elasticsearch'te 'search-as-you-type' performansını edge n-gram ile nasıl optimize ederim?

> Autocomplete'te wildcard kullanmayın; önekleri edge_ngram ile yazma anında üretip arama tarafında standart analyzer bırakın, sorgu term lookup'a insin.

- Soruldu: 2026-05-23
- Yanıtlandı: 2026-05-26
- Soran: Efe
- Etiketler: performans, elasticsearch, veritabani
- Kaynak: https://www.muhammetsafak.com.tr/sor-bakalim/elasticsearch-anlik-arama-edge-ngram-ile-optimizasyon/
- Dil: tr-TR
- Yazar: Muhammet Şafak

---
**Soru:** E-ticaret arama çubuğunda kullanıcı her harf yazdığında Elasticsearch'te arama tetikleniyor; ürün sayısı 10M+. `Wildcard`/`Regexp` sorguları CPU'yu tepetaklak ediyor ve gecikme büyüyor.

Aramayı milisaniyelere indirmek için Elasticsearch'te `Edge N-gram` tokenizer'ını ve index-time analizini nasıl kurgulamalıyım?


Kısa cevap: `wildcard`/`regexp`'i bırakın; işi sorgu zamanından index zamanına taşıyın — `edge_ngram` ile önekleri yazarken üretin, autocomplete'in düz bir term lookup'a insin.

Asıl mesele şu: `wildcard`/`regexp` sorgu anında çalışan birer taramadır; inverted index'i verimli kullanamaz, her harfte 10M dokümanı süzmeye çalışır ve CPU'yu yakar. Çözüm sorguyu hızlandırmak değil, çalışmayı önceden yapmak.

1. **Maliyeti index zamanına kaydırın.** `edge_ngram` token filter'ı, bir kelimeyi indexlerken tüm öneklerini ("a", "ay", "ayk", "ayka"...) ayrı token olarak üretir. Kullanıcı "ayk" yazınca artık tarama yok; doğrudan "ayk" token'ı aranır — bu sıradan bir term lookup, milisaniyeler sürer. Anlık aramanın bütün hızı buradan gelir.
2. **Index analyzer ile search analyzer'ı AYIRIN.** Bu en sık yapılan hata. `edge_ngram`'ı yalnızca index tarafında uygulayın (`analyzer`); arama tarafında standart bir analyzer kullanın (`search_analyzer`). Sorguyu da ngramlarsanız kullanıcının yazdığı her önek tekrar parçalanır, alakasız eşleşmeler (noise) ve şişmiş skorlar gelir. Önekleri index üretir, arama sadece eşleştirir.
3. **Türkçe için `lowercase` + `asciifolding` ekleyin.** Custom analyzer'ında ngram'dan önce bu filtreleri koyun: "Şişe" ile "sise", "Ürün" ile "urun" eşleşsin. Kullanıcı aksansız yazsa bile sonucu bulur — Türkçe arama çubuğunda bu pazarlık konusu değil.
4. **Index büyümesini ve gürültüyü sınırlayın.** `min_gram`/`max_gram`'ı dar tutun (ör. 2-15); aksi halde index katlanarak şişer. Hangi alanların aranacağını sınırlayın, client'ta `debounce` (ör. 150 ms) ile her tuş vuruşunda istek atmayın. İsteğe bağlı kısayol: ES'in `search_as_you_type` alan tipini kullanın — bu kurulumu (edge ngram + shingle) sizin yerine hazır yapar.

**Sonuç:** Ben olsam autocomplete'i ya custom `edge_ngram` analyzer'ı ile ya da hazır `search_as_you_type` alanıyla index zamanında kurardım; `wildcard`'ı otomatik tamamlama için asla kullanmazdım. Index analyzer'da ngram + `lowercase` + `asciifolding`, search analyzer'da standart eşleştirme, gram aralığını dar tutun ve client'ta debounce ekleyin. İş bittiğinde 10M üründe arama, harf başına milisaniyeye iner.

## İlgili Yazılar

- [Sadece 'pending' satırları taranan bir kuyruk tablosunda partial index kullanmalı mıyım?](https://www.muhammetsafak.com.tr/sor-bakalim/sadece-pending-satirlari-taranan-bir-kuyruk-tablosunda-partial-index-kullanmali-miyim/) — Sor Bakalım
- [Redis'te canlı leaderboard için neden Sorted Set kullanmalıyım?](https://www.muhammetsafak.com.tr/sor-bakalim/redis-veri-tipleri-leaderboard-icin-sorted-set/) — Sor Bakalım
- [CQRS'i ne zaman uygulamalı ve okuma/yazma modellerini nasıl senkronlamalıyım?](https://www.muhammetsafak.com.tr/sor-bakalim/cqrs-ne-zaman-uygulanir-ve-okuma-yazma-senkronizasyonu/) — Sor Bakalım
