Elasticsearch Nedir ve Neden Kullanılır?
Elasticsearch, Apache Lucene üzerine inşa edilmiş açık kaynaklı, dağıtık bir arama ve analitik motorudur. 2010 yılında Shay Banon tarafından geliştirilen bu teknoloji, bugün milyonlarca uygulamada güçlü arama deneyimleri sunmak için kullanılmaktadır. RESTful API yapısı ve JSON tabanlı dokümantasyon modeli sayesinde modern uygulamalarla kolayca entegre edilebilir.
Geleneksel ilişkisel veritabanları, büyük veri setlerinde tam metin araması yaparken ciddi performans sorunları yaşar. SQL LIKE sorguları index kullanamaz ve tablo taraması gerektirir. Elasticsearch ise ters indeksleme (inverted index) yapısıyla milyonlarca dokümanı milisaniyeler içinde arayabilir. Bu özellik, e-ticaret siteleri, log analiz sistemleri ve içerik yönetim platformları için vazgeçilmez bir avantaj sağlar.
Elasticsearch Temel Kavramları
Index ve Doküman Yapısı
Elasticsearch'te veriler doküman olarak saklanır. Her doküman JSON formatında bir veri kaydını temsil eder. Dokümanlar index adı verilen mantıksal gruplarda organize edilir. İlişkisel veritabanlarıyla karşılaştırıldığında index bir tabloya, doküman ise bir satıra karşılık gelir.
Her index birden fazla shard'a bölünebilir. Shard'lar veriyi fiziksel olarak parçalayarak dağıtık sistemlerde paralel işleme imkanı sunar. Replica shard'lar ise yüksek erişilebilirlik ve okuma performansı sağlar. Bu mimari sayesinde Elasticsearch yatay olarak kolayca ölçeklenebilir.
Mapping ve Veri Tipleri
Mapping, bir index içindeki dokümanların yapısını ve alanların nasıl indeksleneceğini tanımlar. Doğru mapping stratejisi, arama performansı ve sonuç kalitesi açısından kritik öneme sahiptir. Elasticsearch aşağıdaki temel veri tiplerini destekler:
- text: Tam metin araması için analiz edilen metin alanları
- keyword: Filtreleme ve sıralama için analiz edilmeyen tam değerler
- integer, long, float, double: Sayısal veri tipleri
- date: Tarih ve zaman bilgileri
- boolean: Mantıksal doğru/yanlış değerleri
- nested: İç içe geçmiş nesne dizileri
- geo_point: Coğrafi konum verileri
Analyzer ve Tokenizer
Elasticsearch'in arama gücünün arkasında analyzer mekanizması yatar. Bir analyzer üç bileşenden oluşur: character filter, tokenizer ve token filter. Metin önce character filter ile ön işlemden geçirilir, ardından tokenizer ile kelimelere ayrılır ve son olarak token filter ile normalleştirilir.
Türkçe içerik için özel analyzer konfigürasyonu büyük önem taşır. Türkçe'deki ek yapısı ve büyük-küçük harf dönüşümleri standart analyzer ile doğru çalışmayabilir. ICU analyzer veya özel Türkçe analyzer tanımları kullanılarak doğru sonuçlar elde edilebilir.
Elasticsearch Kurulumu ve Konfigürasyonu
Elasticsearch'i Docker ile hızlıca çalıştırabilirsiniz. Tek düğümlü geliştirme ortamı için discovery.type parametresi single-node olarak ayarlanmalıdır. Üretim ortamlarında ise en az üç düğümlü bir cluster yapılandırması önerilir.
Temel konfigürasyon parametreleri elasticsearch.yml dosyasında bulunur. Cluster adı, düğüm adı, ağ bağlantısı, bellek ayarları ve güvenlik konfigürasyonları bu dosyada yapılır. JVM heap boyutu fiziksel belleğin yarısını geçmemelidir ve genellikle 32 GB üst sınır olarak kabul edilir.
Elasticsearch güvenlik ayarlarını mutlaka etkinleştirin. Üretim ortamında kimlik doğrulama, TLS şifreleme ve rol tabanlı erişim kontrolü (RBAC) yapılandırılması zorunludur.
Query DSL ile Arama Sorguları
Temel Sorgu Tipleri
Elasticsearch Query DSL (Domain Specific Language), JSON tabanlı güçlü bir sorgu dilidir. İki ana sorgu kategorisi bulunur: leaf query ve compound query. Leaf query tek bir alanda arama yaparken, compound query birden fazla sorguyu birleştirir.
En sık kullanılan sorgu tipleri şunlardır:
- match: Tam metin araması için standart sorgu tipi
- term: Analiz edilmemiş kesin değer eşleşmesi
- range: Sayısal veya tarih aralığı sorguları
- bool: must, should, must_not ve filter ile birleşik sorgular
- multi_match: Birden fazla alanda aynı anda arama
- wildcard: Joker karakter ile desen eşleştirme
- fuzzy: Yazım hatalarını tolere eden bulanık arama
Bool Sorguları ve Filtreleme
Bool sorguları, karmaşık arama senaryolarında birden fazla koşulu birleştirmek için kullanılır. must bloğu zorunlu eşleşmeleri, should bloğu tercih edilen eşleşmeleri, must_not bloğu hariç tutulacak sonuçları ve filter bloğu puanlama yapmadan filtreleme koşullarını belirler.
Filter kontekstinde çalışan sorgular önbelleğe alınır ve puanlama hesaplaması yapılmadığı için daha hızlı çalışır. Tarih aralığı, durum filtresi ve kategori seçimi gibi kesin koşullar filter bloğunda kullanılmalıdır.
Aggregation ile Veri Analizi
Elasticsearch sadece arama yapmaz, aynı zamanda güçlü veri analizi yetenekleri sunar. Aggregation yapısı üç ana kategoriye ayrılır: metric aggregation sayısal hesaplamalar yapar, bucket aggregation verileri gruplara ayırır ve pipeline aggregation diğer aggregation sonuçları üzerinde işlem yapar.
Faceted search (yüzlü arama) özelliği e-ticaret sitelerinde yaygın olarak kullanılır. Ürünleri markaya, fiyat aralığına veya kategoriye göre gruplamak ve her gruptaki ürün sayısını göstermek aggregation ile kolayca gerçekleştirilebilir.
.NET ile Elasticsearch Entegrasyonu
NEST Kütüphanesi ve Bağlantı
.NET uygulamalarında Elasticsearch ile çalışmak için resmi Elastic.Clients.Elasticsearch NuGet paketi kullanılır. Bu kütüphane, strongly-typed bir API sunarak C# nesneleri ile doğrudan çalışmanıza olanak tanır. Bağlantı ayarları ElasticsearchClientSettings sınıfı ile yapılandırılır.
Bağlantı havuzu (connection pool) stratejisi üretim ortamlarında önemlidir. SingleNodePool tek sunucu için, SniffingConnectionPool dinamik cluster keşfi için ve StaticConnectionPool sabit sunucu listesi için tercih edilir.
Index Oluşturma ve Doküman İşlemleri
C# model sınıflarınızı doğrudan Elasticsearch dokümanlarına dönüştürebilirsiniz. POCO (Plain Old CLR Object) mapping ile property attribute'ları kullanarak mapping tanımı yapabilirsiniz. CreateIndex metodu ile index oluştururken analyzer, mapping ve shard konfigürasyonunu belirleyebilirsiniz.
Tekli doküman ekleme için IndexDocument, toplu işlemler için BulkAll metodu kullanılır. BulkAll, büyük veri setlerini parçalara bölerek paralel olarak indeksler ve hata yönetimi sunar. Güncelleme işlemleri Update metodu ile kısmi güncellemeleri destekler.
Arama Entegrasyonu
Elasticsearch istemcisi üzerinden arama yapmak için Search metodu kullanılır. Lambda ifadeleri ile Query DSL sorgularını C# kodunda doğal biçimde yazabilirsiniz. Sayfalama, sıralama, highlight ve suggestion özellikleri de bu API üzerinden erişilebilir.
Arama sonuçlarında highlight özelliği, eşleşen kelimeleri vurgulayarak kullanıcı deneyimini iyileştirir. Suggestion özelliği ise kullanıcı yazarken otomatik tamamlama ve yazım düzeltme önerileri sunar. Completion suggester, prefix tabanlı hızlı öneriler için optimize edilmiştir.
Performans Optimizasyonu
Index Tasarımı
Doğru index tasarımı Elasticsearch performansının temelini oluşturur. Shard sayısı veri boyutuna göre planlanmalıdır. Genel kural olarak her shard 10-50 GB arasında veri içermelidir. Çok fazla shard cluster yükünü artırırken, çok az shard paralel işleme kapasitesini sınırlar.
Index lifecycle management (ILM) politikaları ile verinin yaşam döngüsünü otomatik yönetebilirsiniz. Sıcak-ılık-soğuk mimari yapısında aktif veriler hızlı disklerde, eski veriler daha ekonomik depolama alanlarında tutulur.
Sorgu Optimizasyonu
Arama sorgularını optimize etmek için aşağıdaki stratejileri uygulayın:
- Filtreleme koşullarını filter kontekstinde kullanarak önbellek avantajından yararlanın
- Gereksiz alanları source filtering ile sonuçlardan çıkarın
- Büyük sonuç setleri için scroll veya search_after API kullanın
- Sık tekrarlanan sorguları request cache ile önbelleğe alın
- Profile API ile yavaş sorguları analiz edin ve iyileştirin
Cluster İzleme ve Bakım
Elasticsearch cluster sağlığını düzenli olarak izlemek kritik öneme sahiptir. Cluster Health API ile genel durum, Cat API ile detaylı istatistikler elde edebilirsiniz. Kibana veya Elastic APM gibi araçlar görsel izleme imkanı sunar.
Force merge işlemi silinmiş dokümanları temizler ve segment sayısını azaltarak arama performansını artırır. Ancak bu işlem yoğun I/O gerektirdiğinden yoğun olmayan saatlerde çalıştırılmalıdır.
Güvenlik ve En İyi Uygulamalar
Elasticsearch güvenliği çok katmanlı olmalıdır. Ağ düzeyinde Elasticsearch portlarını doğrudan internete açmayın ve güvenlik duvarı kuralları ile erişimi sınırlayın. Uygulama düzeyinde API anahtarları veya OAuth token tabanlı kimlik doğrulama kullanın.
Veri güvenliği için alan düzeyinde ve doküman düzeyinde erişim kontrolü yapılandırılabilir. Denetim günlükleri (audit logging) ile tüm erişim ve değişiklik kayıtları tutulabilir. Düzenli yedekleme için snapshot ve restore mekanizmasını kullanın.
Elasticsearch cluster'ınızı asla doğrudan internete açmayın. Bir reverse proxy veya API gateway arkasında çalıştırın ve tüm iletişimi TLS ile şifreleyin.
Sonuç
Elasticsearch, modern uygulamalara güçlü ve ölçeklenebilir arama yetenekleri kazandıran vazgeçilmez bir teknolojidir. Doğru index tasarımı, uygun mapping stratejisi ve optimize edilmiş sorgular ile milisaniyeler içinde milyonlarca doküman arasından sonuç döndürebilirsiniz.
.NET ekosistemiyle kusursuz entegrasyon sağlayan resmi istemci kütüphanesi, C# geliştiricilerine tanıdık bir geliştirme deneyimi sunar. Performans optimizasyonu, güvenlik konfigürasyonu ve cluster yönetimi konularında en iyi uygulamaları takip ederek üretim ortamında güvenilir bir arama altyapısı oluşturabilirsiniz.
Elasticsearch öğrenme eğrisi başlangıçta dik olsa da, sunduğu esneklik ve performans avantajları bu yatırımı fazlasıyla karşılar. Küçük bir geliştirme ortamıyla başlayarak temel kavramları pekiştirin ve uygulamanızın arama deneyimini bir üst seviyeye taşıyın.