İçeriğe geç
Muhammet Şafak
en
Soran: Efe Cevaplandı:

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


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?

Cevap

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.

Paylaş:

Yorumlar

Yorum yapmak için GitHub hesabınızla giriş yapmanız yeterli. Yorumlar GitHub Discussions üzerinde saklanır.

Diğer Sorular

Tüm sorular

Sitede Ara

Yazı, proje ve sayfalarda arama yapmak için yazmaya başlayın.

Esc ile kapat Pagefind ile güçlendirildi