Günümüzde internete bağlı sistemlerin devasa miktarda veri üretmesi sonucunda verinin hızlı olarak sunulması problemi ortaya çıktı. Elasticsearch geleneksel ilişkisel veritabanlarına alternatif olarak ortaya hızlı çalışan bir çözüm olarak ortaya çıktı. Belgeleri JSON formatında saklayan bir NoSQL veritabanına benzetilse de gerçek amacı tam metin araması (full-text search) olan bir araç olarak geliştirilmiştir. Veritabanı olarak kullanılmaması gerekmektedir. Bu konuyu yazının ilerleyen kısımlarında detaylı bahsedeceğim.Elasticsearch ile devam edersek basit olarak kitapların en arkalarında hangi kavramın hangi sayfada olduğunu tutan bir sözlük gibi düşünebiliriz. Normal bir veritabanında kelimeyi bulmak için tüm veritabanı satırlarını tek tek okumanız gerekir. Elasticseach'ün kullandığı Inverted Index ile hangi kelimenin, hangi belgede geçtiğini önceden listeler. Siz arama yaptığınızda Elasticsearch doğrudan o belgelere gider.


Elasticsearch hakkında temel kavramları birçok kaynaktan araştırarak öğrenebilirsiniz. Bu yazıda Elasticsearch’ün temel kavramlarından değil, nasıl hızlı çalıştığını, nasıl skor verdiğini, match ile match_phrase farkını, must, filter, should kullanımını, fuzziness, copy_to, aggregation mantığını gerçek kullanım senaryolarıyla anlatacağız.


Elasticsearch Neden Bu Kadar Hızlı?


Klasik veritabanlarında arama yapmak genelde satır satır tarama anlamına gelir. Elasticsearch ise farklı çalışır. Verileri inverted index yapısında tutar.
Yani:
Kelime → hangi dokümanlarda geçiyor?
şeklinde bir indeks oluşturur.
Örneğin:
"elasticsearch" → doc1, doc8, doc20"performans" → doc3, doc8
Bu yüzden milyonlarca kayıt arasında milisaniyeler içinde arama yapabilir.

Sonuçlar Neye Göre Sıralanıyor?
Elasticsearch her belgeye bir _score değeri verir.
Bu skorun temel amacı:
“Bu belge aranan şeye ne kadar alakalı?”
sorusunu cevaplamaktır.
Modern Elasticsearch sürümlerinde varsayılan algoritma BM25’tir.
Skoru etkileyen temel faktörler:
1. Kelime Sıklığı (TF) Kelime belgede ne kadar fazla geçiyorsa skor artar. Ama doğrusal artmaz. 10 kez geçmek ile 100 kez geçmek arasında dev fark oluşmaz. 2. Kelimenin Nadirliği (IDF) “ve”, “bir”, “the” gibi her yerde geçen kelimeler düşük skor üretir. Nadir geçen teknik kelimeler daha değerlidir.

3. Alan Uzunluğu Başlıkta geçen kelime, uzun içerikte geçenden daha anlamlı kabul edilir. Bu yüzden title alanları genelde boost edilir.

match Sorgusu Nasıl Çalışır?


match tam metin araması yapar. Metni tokenize eder.
Örneğin:

{ "query": { "match": { "content": "elasticsearch performans" } }}

Bu sorgu çeriğinde birebir “elasticsearch performans” geçen kelimeleri aramaz. elasticsearch veya performans kelimelerinden birini içeren belgeleri arar.
Varsayılan davranış OR mantığıdır. Yani iki kelimeden biri geçse bile sonuç dönebilir. Bu bazen fazla alakasız sonuç üretir. Bu yüzden çoğu gerçek projede şunu görürsünüz:

{ "query": { "match": { "content": { "query": "elasticsearch performans", "minimum_should_match": 2 } } }}

Bu yaklaşım en az iki kelimeyi içeren belgeleri arayarak arama sonucu kalitesini artırır. Elastic search'in

match_phrase Neden Gereklidir?


Bazı durumlarda kelimelerin sırayla geçmesi gerekir.
Örneğin: "ürün adı, film adı, hata mesajı, şarkı adı". Bu durumda match_phrase kullanılır.

{ "query": { "match_phrase": { "title": "quick fox" } }}

Bu sorgu: “quick brown fox” ile varsayılan durumda eşleşmez. Çünkü arada ekstra kelime vardır. Burada slop devreye girer:

{ "query": { "match_phrase": { "title": { "query": "quick fox", "slop": 1 } } }}

Bu kullanım kullanıcı deneyimini ciddi iyileştirir.

Elasticsearch içerisinde yaykın kullanılan diğer bir konu bool Query'lerdir. Elasticsearch’ün asıl gücü burada başlar. Çünkü gerçek aramalar tek koşullu değildir. Örneğin:title içinde “elasticsearch” geçsin, status published olsun, category draft olmasın, search etiketi varsa ekstra puan alsın ...

İşte bunun çözümü:

{"query":{"bool":{"must":[{"match":{"title":"elasticsearch"}}],"should":[{"match":{"tags":"search"}}],"filter":[{"term":{"status":"published"}}],"must_not":[{"term":{"category":"draft"}}]}}}

Buradaki en kritik fark: must → skoru etkiler filter → sadece filtreler. Bu performans açısından çok önemlidir.

filter Neden Çok Daha Hızlıdır?


Arama sonuçları skorlama yapmadan önce eleyerek arama sonucu sayısını azaltmak için fiter kullanılmalıdır. Filter önce çalışarak istenmeyen kayıtları eler. ve skor hesaplamaz. Skor hesaplanmadan sonuç kümesinin küçültülmesi skorlama için harcanan eforun performasını arttırır. Cache kullanır.
kategori, tarih, durum, stok, aktif/pasif gibi alanlar her zaman filter içinde olmalıdır. Yeni başlayanların en büyük hatalarından biri her şeyi must içine koymaktır.

Filter Cache kullanır diye bahsettik. Peki Cache (Önbellek) Nasıl Çalışır?
filter kullanarak "status": "published" sorgusunu ilk kez çalıştırdığınızda, Elasticsearch arka planda gizli bir Bitset (Ayna Defteri) oluşturur.Bu defterde 1 milyon belgenin sadece Evet/Hayır haritası tutulur:Belge 1: 1 (Published)Belge 2: 0 (Draft)Belge 3: 1 (Published)Bir sonraki kullanıcı gelip yine aynı filtreyi sorduğunda, Elasticsearch tüm belgeleri baştan incelemez. Hafızadaki (cache) bu hazır 1 ve 0 haritasına bakar ve saniyeler sürecek işlemi milisaniyeler içinde bitirir.

Fuzziness Gerçekten Ne İşe Yarar?
Kullanıcıların aramak istedikleri kelimeleri düzgün yazmadığı durumlarda fuziness devreye girer.
Örneğin "elasticsaerch, performnce, iphnoe" gibi aramalarla ile karşılaşılabilir. Kullanıcılar bir veya bir kaç kelimeyi hatalı olarak girebilir. fuzziness bu problemin çözümüdür. Aşağıdaki gibi kullanılabilir.

{ "query": { "match": { "title": { "query": "elasticsaerch", "fuzziness": "AUTO" } } }}

Ama burada dikkat edilmesi gereken önemli konu:.
Fuzziness arttıkça: CPU maliyeti artar, alakasız sonuçlar artar.
Bu yüzden çoğu durumda AUTO yeterlidir.

.keyword Alanı Neden Bu Kadar Önemli?
Text alanları tokenize edilir. sonuç olarak "iphone 13 pro" iphone13pro token şekline dönüşebilir. Bu yüzden tam eşleşme istenen aramalar için .keyword gerekir.

{ "query": { "term": { "brand.keyword": "iphone 13 pro" } }}

Aynı alan:
sorting, aggregation, grouping işlemlerinde de kullanılır.

Aggregation Elasticsearch’ün güçlü başka bir aracıdır. Birçok kişi Elasticsearch’ü sadece arama motoru olarak kullanır.
Fakat elasticsearch aggregation işlemlerinde de güçlü sonuçlar vermektedir.
Örneğin:
marka sayıları,ökategori dağılımı, günlük satış grafikleri, ortalama fiyat, en popüler ürünler elasticsearch ile çok hızlı şekilde hesaplanabilir.

{ "aggs": { "brands": { "terms": { "field": "brand.keyword" } } }}

E-ticaret filtrelerinin çoğu aggregation ile oluşur.