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.
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 bakabilirsin.
Neden
-
Tarama ile lookup arasındaki fark ölçek farkıdır.
edge_ngrambir 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. -
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.
-
Ngram index’i katlanarak şişirir. Gram aralığını geniş tutmak, kazandığınız hızı disk ve RAM olarak geri öder.
Ne yapmalı
-
edge_ngram’ı yalnızca index tarafında uygulayın.analyzerindex’te ngram üretsin,search_analyzerarama tarafında standart kalsın. Önekleri index üretir, arama sadece eşleştirir. -
Türkçe için
lowercase+asciifoldingekleyin. 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. -
min_gram/max_gram’ı dar tutun (ör. 2-15) ve hangi alanların aranacağını sınırlayın. -
Client’ta debounce ekleyin (ör. 150 ms); her tuş vuruşunda istek atmayın.
-
Kısayolu değerlendirin. ES’in
search_as_you_typealan 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 10M üründe arama, harf başına milisaniyeye iner.
Yorumlar
Yorum yapmak için GitHub hesabınızla giriş yapmanız yeterli. Yorumlar GitHub Discussions üzerinde saklanır.