# 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://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.

## Kısa cevap

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. Elasticsearch'ün index/analiz modeline giriş için [Elasticsearch ve Kibana yazısına](/tr/blog/elasticsearch-ve-kibana-ile-buyuk-veriye-giris/) bakabilirsin.

## Neden

1. **Tarama ile lookup arasındaki fark ölçek farkıdır.** `edge_ngram` bir kelimeyi indekslerken tüm öneklerini ("a", "ay", "ayk", "ayka"…) ayrı token olarak üretir; kullanıcı "ayk" yazınca artık tarama yok, doğrudan o token aranır. Anlık aramanın bütün hızı buradan gelir.

2. **En sık yapılan hata analyzer'ları ayırmamaktır.** Sorguyu da ngramlarsanız kullanıcının yazdığı her önek tekrar parçalanır; alakasız eşleşmeler ve şişmiş skorlar gelir.

3. **Ngram index'i şişirir.** Gram aralığını geniş tutmak, kazandığınız hızı disk ve RAM olarak geri öder.

## Ne yapmalı

1. **`edge_ngram`'ı yalnızca index tarafında uygulayın.** `analyzer` index'te ngram üretsin, `search_analyzer` arama tarafında standart kalsın. Önekleri index üretir, arama sadece eşleştirir.

2. **Türkçe için `lowercase` + `asciifolding` ekleyin.** Custom analyzer'da ngram'dan önce koyun: "Şişe" ile "sise", "Ürün" ile "urun" eşleşsin. Türkçe arama çubuğunda bu pazarlık konusu değil.

3. **`min_gram`/`max_gram`'ı dar tutun** (ör. 2-15) ve hangi alanların aranacağını sınırlayın.

4. **Client'ta debounce ekleyin** (ör. 150 ms); her tuş vuruşunda istek atmayın.

5. **Kısayolu değerlendirin.** ES'in `search_as_you_type` alan tipi bu kurulumu (edge ngram + shingle) sizin yerinize 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 her harf, 10M ürün üzerinde tarama yerine düz bir term araması olur.

## İlgili Yazılar

- [Heap erişimini önlemek ve index-only scan almak için covering index'e (INCLUDE) ne zaman geçmeliyim?](https://muhammetsafak.com/tr/sor-bakalim/index-only-scan-covering-indexe-ne-zaman-gecmeliyim/) — Sor Bakalım
- [Sadece 'pending' satırları taranan bir kuyruk tablosunda partial index kullanmalı mıyım?](https://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://muhammetsafak.com/tr/sor-bakalim/redis-veri-tipleri-leaderboard-icin-sorted-set/) — Sor Bakalım
