İç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.

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

  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 katlanarak ş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 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