Elasticsearch Nedir?
Elasticsearch, Apache Lucene üzerine inşa edilmiş, dağıtık ve açık kaynaklı bir arama ve analiz motorudur. Gerçek zamanlı full-text arama, yapısal veri analizi, log yönetimi ve uygulama performans izleme gibi geniş bir kullanım alanına sahiptir. 2010 yılında Shay Banon tarafından geliştirilen Elasticsearch, bugün dünyanın en popüler arama motorlarından biri haline gelmiştir.
Wikipedia, GitHub, Netflix ve Uber gibi dünya devleri Elasticsearch'ü çeşitli amaçlarla kullanmaktadır. RESTful API arayüzü, JSON tabanlı sorgu dili ve yatay ölçeklenebilirlik özellikleri sayesinde geliştiriciler tarafından yaygın olarak tercih edilmektedir.
Inverted Index: Elasticsearch'ün Temeli
Elasticsearch'ün arama performansının sırrı inverted index (ters çevrilmiş dizin) veri yapısındadır. Geleneksel veritabanları belgeleri sıralı olarak tararken, inverted index her terimin hangi belgelerde geçtiğini önceden haritalandırır.
Inverted Index Nasıl Çalışır?
Bir kitabın arkasındaki dizini düşünün: belirli bir kelimeyi aramak istediğinizde, kitabın tamamını okumak yerine dizine bakarsınız ve kelimenin hangi sayfalarda geçtiğini bulursunuz. Inverted index tam olarak bu mantıkla çalışır.
Örneğin üç belgeniz olsun:
- "Elasticsearch hızlı bir arama motorudur"
- "Elasticsearch dağıtık çalışır"
- "Arama motorları verileri indeksler"
Inverted index şu şekilde oluşur:
| Terim | Belge Listesi |
|---|---|
| elasticsearch | [1, 2] |
| hızlı | [1] |
| arama | [1, 3] |
| motorudur | [1] |
| dağıtık | [2] |
| çalışır | [2] |
| motorları | [3] |
| verileri | [3] |
| indeksler | [3] |
Bu yapı sayesinde milyonlarca belge arasında milisaniyeler içinde arama yapılabilir.
Elasticsearch Temel Kavramları
Index (Dizin)
Elasticsearch'te bir index, benzer özelliklere sahip belgelerin koleksiyonudur. İlişkisel veritabanlarındaki tablo kavramına benzer. Her index bir veya birden fazla shard'a (parça) bölünebilir ve her shard ayrı bir Lucene örneğidir.
Document (Belge)
Elasticsearch'te temel veri birimi JSON formatındaki belgedir. Her belge bir index içinde saklanır ve benzersiz bir kimliğe sahiptir. Belgeler alanlar (fields) içerir ve bu alanlar farklı veri tiplerine sahip olabilir.
Shard ve Replica
Shard, bir index'in yatay olarak bölünmüş parçasıdır. Bu sayede veriler birden fazla düğüm (node) üzerine dağıtılabilir. Replica shard'lar ise yedekleme ve okuma performansı için oluşturulan kopyalardır.
Mapping ve Veri Tipleri
Mapping, bir index'teki belgelerin şemasını tanımlar. Her alanın veri tipini, nasıl indeksleneceğini ve nasıl aranacağını belirler. Doğru mapping tanımı, arama performansı ve sonuç kalitesi için kritik öneme sahiptir.
Yaygın Veri Tipleri
- text: Full-text arama için analiz edilen metin alanları
- keyword: Filtreleme, sıralama ve aggregation için kullanılan tam eşleşme alanları
- integer/long/float/double: Sayısal veri tipleri
- date: Tarih ve zaman alanları
- boolean: True/false değerleri
- nested: İç içe geçmiş nesneler
- geo_point: Coğrafi koordinat verileri
Dynamic vs Explicit Mapping
Elasticsearch, yeni bir alan gördüğünde otomatik olarak mapping oluşturabilir (dynamic mapping). Ancak üretim ortamlarında explicit mapping kullanmak çok daha güvenilirdir çünkü veri tiplerini tam olarak kontrol etmenizi sağlar ve beklenmeyen tip dönüşümlerini önler.
Analyzer'lar: Metnin İndekslenmesi
Analyzer, metnin indekslenme sürecinde nasıl işleneceğini tanımlar. Üç bileşenden oluşur:
Character Filter
Ham metin üzerinde karakter düzeyinde dönüşümler yapar. HTML etiketlerini temizleme, özel karakterleri dönüştürme gibi işlemler bu aşamada gerçekleşir.
Tokenizer
Metni token'lara (kelime parçalarına) böler. Standard tokenizer boşluklara ve noktalama işaretlerine göre bölerken, ngram tokenizer belirtilen uzunlukta karakter dizileri oluşturur.
Token Filter
Token'lar üzerinde dönüşümler uygular. Küçük harfe çevirme (lowercase), eş anlamlı kelime ekleme (synonym), durdurma kelimelerini çıkarma (stop words) ve kök bulma (stemming) gibi işlemler bu aşamada yapılır.
Türkçe metinler için özel analyzer tanımlaması kritik öneme sahiptir. Türkçe'nin agglutinative yapısı nedeniyle standart analyzer yeterli sonuç vermeyebilir. ICU analyzer veya özel Türkçe stemmer kullanımı önerilir.
Arama Sorguları
Match Query
Full-text arama için en temel sorgu tipidir. Verilen metin analyzer'dan geçirilir ve terimlere ayrılır. Her terimi içeren belgeler sonuç olarak döndürülür ve ilgililik skoruna göre sıralanır.
Term Query
Tam eşleşme araması yapar. Keyword alanlarında filtreleme için kullanılır. Text alanlarında kullanılmamalıdır çünkü analyzer'dan geçmez.
Bool Query
Birden fazla sorguyu mantıksal operatörlerle birleştirmek için kullanılır. must (VE), should (VEYA), must_not (DEĞİL) ve filter (puansız filtreleme) bileşenlerinden oluşur.
Range Query
Sayısal veya tarih alanlarında aralık sorgulaması yapar. gte (büyük eşit), lte (küçük eşit), gt (büyük), lt (küçük) operatörleri kullanılır.
Aggregation (Toplu İşlemler)
Elasticsearch'ün en güçlü özelliklerinden biri aggregation desteğidir. Verileri gruplandırma, istatistik hesaplama ve analiz etme imkanı sağlar.
Bucket Aggregation
Belgeleri gruplara ayırır. Terms aggregation en yaygın kullanılanıdır ve SQL'deki GROUP BY ifadesine benzer. Histogram ve date histogram aggregation'ları zaman bazlı analizler için kullanılır.
Metric Aggregation
Sayısal değerler üzerinde hesaplamalar yapar: avg (ortalama), sum (toplam), min (minimum), max (maksimum), cardinality (benzersiz değer sayısı) gibi metrikler hesaplanır.
Pipeline Aggregation
Diğer aggregation'ların sonuçları üzerinde çalışır. Moving average, cumulative sum ve derivative gibi gelişmiş analizler yapılabilir.
ELK Stack: Elasticsearch, Logstash, Kibana
ELK Stack, log yönetimi ve veri analizi için en popüler açık kaynak çözümdür.
Logstash
Veri toplama ve dönüştürme aracıdır. Çeşitli kaynaklardan (dosyalar, veritabanları, message queue'lar) veri toplayabilir, bu verileri filtreleyip dönüştürebilir ve Elasticsearch'e gönderebilir. Grok pattern'ları ile yapılandırılmamış log verilerini parse etmek mümkündür.
Kibana
Elasticsearch verilerini görselleştirmek için kullanılan web tabanlı arayüzdür. Dashboard'lar, grafikler, haritalar ve tablolar oluşturarak verileri anlaşılır hale getirir. Discover sekmesi ile ad-hoc arama, Visualize ile görselleştirme ve Dashboard ile birleşik panolar oluşturulabilir.
Beats
Hafif veri toplama ajanlarıdır. Filebeat (log dosyaları), Metricbeat (sistem metrikleri), Packetbeat (ağ verileri) ve Heartbeat (uptime izleme) gibi çeşitleri vardır. Beats, Logstash'e alternatif olarak doğrudan Elasticsearch'e veri gönderebilir.
Performans Optimizasyonu
- Shard Sayısı: Her shard bir Lucene örneği olduğundan, çok fazla shard performansı düşürür. Genel kural: her shard 10-50 GB arasında olmalıdır.
- Bulk API: Toplu veri indeksleme için her zaman Bulk API kullanılmalıdır.
- Doc Values: Aggregation ve sıralama için doc values etkinleştirilmelidir.
- Filter Cache: Bool query'de filter kontekstinde kullanılan sorgular önbelleğe alınır ve daha hızlı çalışır.
- Index Lifecycle Management: Eski indeksleri otomatik olarak yönetmek için ILM politikaları tanımlanmalıdır.
Sonuç
Elasticsearch, modern uygulamaların arama ve analiz ihtiyaçlarını karşılamak için güçlü ve esnek bir çözüm sunar. Inverted index yapısı sayesinde milisaniyeler içinde arama yapabilir, aggregation desteğiyle karmaşık analizler gerçekleştirebilir ve ELK Stack entegrasyonuyla kapsamlı log yönetimi sağlayabilirsiniz. Doğru mapping tasarımı, uygun analyzer seçimi ve performans optimizasyonu ile Elasticsearch'ten maksimum verim alabilirsiniz.