Elasticsearch Nedir? Kapsamlı Başlangıç Rehberi 2026
Elasticsearch Nedir? Kapsamlı Başlangıç Rehberi
Şöyle bir sahne düşün: e-ticaret sitende 5 milyon ürün var. Kullanıcı arama kutusuna "siyah deri ceket erkek XL" yazıyor. Geleneksel bir SQL veritabanıyla bu aramayı yapmaya çalışsan — LIKE '%siyah%' AND LIKE '%deri%' — saniyeler geçer, sonuçlar alakasız gelir, kullanıcı sayfayı kapatır. Oysa Amazon'da aynı arama 50 milisaniyede tamamlanır ve üstüne "siyah deri mont" gibi benzer sonuçları da akıllıca listeler.
İşte bu sihrin arkasında Elasticsearch var. Netflix izleme geçmişinde arama yaparken, GitHub'da kod ararken, Wikipedia'da makale ararken — hepsinin arka planında Elasticsearch çalışıyor.
Bu yazıda Elasticsearch nedir, nasıl çalışır, temel kavramları nelerdir, nasıl kurulur, ilk sorguların nasıl yazılır, ELK Stack'in ne olduğu, Java ile nasıl entegre edilir ve performans ipuçları dahil her şeyi sade bir dille anlatacağız.
1. Elasticsearch Nedir?
Elasticsearch, Apache Lucene üzerine inşa edilmiş, dağıtık (distributed), RESTful bir arama ve analitik motorudur. 2010 yılında Shay Banon tarafından geliştirilmiş ve bugün Elastic şirketi tarafından yönetilmektedir.
Apache Lucene üzerine inşa: Lucene, Java ile yazılmış güçlü bir full-text arama kütüphanesidir. Doğrudan kullanmak karmaşıktır. Elasticsearch, Lucene'i sarmalayarak onu REST API üzerinden kolay kullanılabilir hale getirir.
Dağıtık: Verini birden fazla sunucuya yayarak depolar. Bir sunucu çökerse diğerleri devam eder.
RESTful: Tüm işlemleri basit HTTP istekleriyle (GET, POST, PUT, DELETE) yaparsın —
curlyeter.
Analoji olarak bir kütüphane kataloğu düşün. 1 milyon kitap var ve "2020 sonrası yazılmış Türkçe biyoloji kitapları" arıyorsun. Raf raf dolaşmak (SQL LIKE sorgusu) saatler sürer. Ama dijital katalog (Elasticsearch) her kitabı yazar, konu, yıl bazında indekslemiştir — saniyeler içinde sonuç gelir.
💡 Kısaca: Elasticsearch, büyük miktarda veriyi çok hızlı şekilde arayabilen, analiz edebilen, dağıtık bir arama motorudur.
Öne Çıkan Özellikleri
| Özellik | Açıklama |
|---|---|
| Full-Text Search | Typo toleransı, eş anlamlılar, stemming ile akıllı arama |
| Near Real-Time | Veri eklendikten ~1 saniye sonra aranabilir |
| Dağıtık Mimari | Otomatik sharding ve replication |
| Schema-Free | Veri yapısını önceden tanımlamak zorunlu değil (ama önerilir) |
| RESTful API | JSON over HTTP — dil bağımsız |
| Aggregation | SQL GROUP BY'ın çok daha güçlü versiyonu |
2. Elasticsearch Nasıl Çalışır?
Elasticsearch'ün sihri inverted index (ters dizin) yapısındadır.
Inverted Index Nedir?
Bir kitabın arkasındaki dizin bölümünü düşün. "Fotosentez" kelimesini arıyorsun, dizine bakıyorsun: "sayfa 42, 78, 156." Kitabı baştan sona okumana gerek yok.
Geleneksel veritabanları forward index kullanır: arama için TÜM dökümanları tarar. Inverted index ise bunun tersidir: her kelime için hangi dökümanlarda geçtiğini saklar.
Üç döküman örneği:
| Doc ID | İçerik |
|---|---|
| 1 | "Elasticsearch hızlı bir arama motorudur" |
| 2 | "Elasticsearch dağıtık çalışır" |
| 3 | "Arama motoru hızlı olmalıdır" |
Inverted index:
| Terim | Dökümanlar |
|---|---|
| elasticsearch | [1, 2] |
| hızlı | [1, 3] |
| arama | [1, 3] |
| dağıtık | [2] |
"hızlı arama" diye aratırsan: hızlı → [1, 3] ve arama → [1, 3] kesişimi = Doc 1 ve Doc 3 — milisaniyeler içinde.
Analyzer Süreci
Veri eklendiğinde bir analiz pipeline'ı devreye girer:
Character Filters: Özel karakterleri temizler (HTML tag'leri kaldır)
Tokenizer: Metni kelime kelime parçalar
Token Filters: Küçük harfe çevir, stop word'leri kaldır, stemming yap ("çalışıyordu" → "çalış")
Bu sayede kullanıcı "çalışıyor" yazsa bile "çalışır", "çalıştı" içeren dökümanları bulabilir.
⚠️ Dikkat: Türkçe içerik için mutlaka Türkçe analyzer kullan. Varsayılan
standardanalyzer Türkçe stemming yapmaz.
3. Temel Kavramlar: Index, Document, Shard, Replica
Document (Döküman)
Elasticsearch'te verinin en küçük birimi. Her document bir JSON nesnesidir — SQL'deki bir satır (row) gibi düşünebilirsin:
{
"id": 1,
"title": "Elasticsearch Nedir?",
"author": "Tolgahan",
"content": "Elasticsearch dağıtık bir arama motorudur...",
"tags": ["elasticsearch", "search"],
"created_at": "2026-03-02T10:30:00Z"
}Index (İndeks)
Benzer document'ların toplandığı koleksiyon — SQL'deki tablo karşılığı. Örneğin products index'i ürünleri, users index'i kullanıcıları barındırır.
Shard (Parça)
Veri büyüdüğünde tek makineye sığmayabilir. Elasticsearch bir index'i shard'lara böler. Her shard bağımsız bir Lucene index'idir ve farklı node'lara dağıtılabilir.
Pizza analojisi 🍕: 8 dilimlik pizza, her dilim bir shard. Dilimler farklı tabaklara (node'lara) dağıtılır. Arama yaptığında tüm dilimler paralel aranır.
Replica (Kopya)
Shard'ın birebir kopyası. İki amaca hizmet eder:
Yüksek erişilebilirlik: Node çökerse replica devam eder
Okuma performansı: Sorgular hem primary hem replica'dan yanıtlanır
💡 İpucu: Replica sayısı sonradan artırılabilir, ama shard sayısı index oluşturulduktan sonra değiştirilemez (reindex gerekir). Başlangıçta iyi planla.
Kavram Karşılaştırma Tablosu
| Elasticsearch | SQL Karşılığı | Açıklama |
|---|---|---|
| Index | Table | Document'ların toplandığı yer |
| Document | Row | Tek bir veri kaydı (JSON) |
| Field | Column | Document içindeki alan |
| Mapping | Schema | Alanların veri tiplerini tanımlar |
| Shard | Partition | Verinin fiziksel parçası |
| Cluster | Database Server | Node'ların toplamı |
4. Elasticsearch Kurulumu
Docker ile Kurulum (Önerilen)
# Elasticsearch 8.x'i Docker ile çalıştır
docker run -d \
--name elasticsearch \
-p 9200:9200 \
-e "discovery.type=single-node" \
-e "xpack.security.enabled=false" \
-e "ES_JAVA_OPTS=-Xms512m -Xmx512m" \
docker.elastic.co/elasticsearch/elasticsearch:8.17.0Kontrol et:
curl http://localhost:9200{
"name": "a1b2c3d4e5f6",
"cluster_name": "docker-cluster",
"version": {
"number": "8.17.0",
"lucene_version": "9.12.0"
},
"tagline": "You Know, for Search"
}Bu yanıtı gördüysen — Elasticsearch çalışıyor! 🎉
Docker Compose ile (Kibana Dahil)
version: '3.8'
services:
elasticsearch:
image: docker.elastic.co/elasticsearch/elasticsearch:8.17.0
environment:
- discovery.type=single-node
- xpack.security.enabled=false
- ES_JAVA_OPTS=-Xms1g -Xmx1g
ports:
- "9200:9200"
volumes:
- es-data:/usr/share/elasticsearch/data
kibana:
image: docker.elastic.co/kibana/kibana:8.17.0
environment:
- ELASTICSEARCH_HOSTS=http://elasticsearch:9200
ports:
- "5601:5601"
depends_on:
- elasticsearch
volumes:
es-data:docker compose up -d⚠️ Dikkat: Elasticsearch minimum 2GB RAM ister (geliştirme). Production'da 8GB+ önerilir. Heap size toplam RAM'in yarısını geçmemeli ve 32GB'ı aşmamalıdır.
5. İlk Query'ler: CRUD İşlemleri
Index Oluşturma ve Mapping
curl -X PUT "http://localhost:9200/products" -H "Content-Type: application/json" -d '{
"settings": {
"number_of_shards": 3,
"number_of_replicas": 1
},
"mappings": {
"properties": {
"name": { "type": "text" },
"description": { "type": "text" },
"price": { "type": "float" },
"category": { "type": "keyword" },
"in_stock": { "type": "boolean" },
"created_at": { "type": "date" }
}
}
}'`text` vs `keyword` farkı önemli:
text: Full-text search için. Analyze edilir. ("Siyah Deri Ceket" → ["siyah", "deri", "ceket"])
keyword: Tam eşleşme, filtreleme, sıralama için. Analyze edilmez.
Document Ekleme
# ID belirterek ekle
curl -X PUT "http://localhost:9200/products/_doc/1" -H "Content-Type: application/json" -d '{
"name": "Siyah Deri Ceket",
"description": "Gerçek deri, slim fit erkek ceket. Su geçirmez astar.",
"price": 1299.99,
"category": "Giyim",
"in_stock": true,
"created_at": "2026-03-01T10:00:00Z"
}'
# Otomatik ID ile ekle
curl -X POST "http://localhost:9200/products/_doc" -H "Content-Type: application/json" -d '{
"name": "Beyaz Spor Ayakkabı",
"description": "Hafif, nefes alabilen koşu ayakkabısı.",
"price": 899.50,
"category": "Ayakkabı",
"in_stock": true,
"created_at": "2026-03-02T08:00:00Z"
}'Arama (Search)
# Full-text arama
curl -X GET "http://localhost:9200/products/_search" -H "Content-Type: application/json" -d '{
"query": {
"match": {
"description": "deri ceket su geçirmez"
}
}
}'Bu sorgu "deri", "ceket", "su", "geçirmez" kelimelerinden herhangi birini içeren document'ları döner ve relevance score'a göre sıralar.
Bool Query: Birden Fazla Koşul
curl -X GET "http://localhost:9200/products/_search" -H "Content-Type: application/json" -d '{
"query": {
"bool": {
"must": [
{ "match": { "description": "deri ceket" } }
],
"filter": [
{ "term": { "category": "Giyim" } },
{ "range": { "price": { "gte": 500, "lte": 2000 } } },
{ "term": { "in_stock": true } }
]
}
},
"sort": [{ "price": "asc" }],
"size": 10
}'must: Relevance score'a etki eder — "deri ceket" içerenler
filter: Score'a etki etmez, cache'lenir — kategori, fiyat aralığı, stok filtresi
sort: Fiyata göre sırala
size: Maksimum 10 sonuç
💡 İpucu:
filteriçindeki koşullar cache'lenir ve score hesaplanmaz —must'a göre çok daha hızlıdır. Score gerekmiyorsa her zamanfilterkullan.
Güncelleme ve Silme
# Kısmi güncelleme
curl -X POST "http://localhost:9200/products/_update/1" -H "Content-Type: application/json" -d '{
"doc": { "price": 1199.99, "in_stock": false }
}'
# Silme
curl -X DELETE "http://localhost:9200/products/_doc/1"6. Kullanım Alanları
🔍 Full-Text Search
E-ticaret, blog, dokümantasyon, haber portalları — kullanıcının aradığı her yer. SQL LIKE yetersiz kalır: typo toleransı yok, eş anlamlı arama yok, relevance scoring yok. Elasticsearch bunların hepsini yapar.
📊 Log Analizi ve Monitoring
En yaygın production kullanımı. Netflix günde 1 trilyon event'i Elasticsearch'e yazar. Hata olduğunda mühendisler saniyeler içinde kaynağı bulur:
Uygulamalar → Filebeat → Elasticsearch → Kibana Dashboard🛒 E-Ticaret
Autocomplete ("siy" → "siyah ceket" önerisi), faceted search (sol taraftaki filtreler), fuzzy search ("ayakabi" → "ayakkabı"), synonym desteği ("tişört" → "t-shirt").
🔭 Observability
Logs, Metrics, Traces — modern sistemlerin üç observability sinyali. Elasticsearch üçünü de depolar ve analiz eder. APM ile hangi endpoint yavaş, hangi query darboğaz yaratıyor tespit edilir.
🗺️ Coğrafi Arama
geo_point ve geo_shape desteği: "en yakın 5 restoran", "İstanbul sınırları içindeki depolar" gibi sorgular.
7. ELK Stack Nedir?
ELK Stack, Elasticsearch ekosisteminin ünlü üçlüsüdür:
| Bileşen | Rol | Analoji |
|---|---|---|
| Elasticsearch | Depolama ve arama | Beyin — bilgiyi saklar ve bulur |
| Logstash | Veri toplama ve dönüştürme | Kulaklar — kaynaklardan veri toplar |
| Kibana | Görselleştirme | Gözler — veriyi görselleştirir |
Logstash
Farklı kaynaklardan (dosya, veritabanı, Kafka, API) veri alır, dönüştürür (parse, filtre, zenginleştir) ve Elasticsearch'e yazar.
Kibana
Elasticsearch verileriyle dashboard oluşturmanı sağlayan web arayüzü: Discover (interaktif arama), Dashboard (grafik/tablo), Dev Tools (sorgu konsolu), Alerting (alarm).
Beats
Hafif veri toplayıcılar: Filebeat (loglar), Metricbeat (sistem metrikleri), Packetbeat (ağ trafiği), Heartbeat (uptime kontrolü).
💡 İpucu: Küçük projelerde Logstash yerine doğrudan Filebeat → Elasticsearch yeterli. Logstash karmaşık dönüşüm gerektiğinde devreye girer.
8. Java ile Elasticsearch Entegrasyonu
Elasticsearch Java ile yazıldığı için Java ekosistemiyle entegrasyonu mükemmeldir.
Elasticsearch Java Client
// Client oluştur
RestClient restClient = RestClient.builder(
new HttpHost("localhost", 9200)
).build();
ElasticsearchClient client = new ElasticsearchClient(
new RestClientTransport(restClient, new JacksonJsonpMapper())
);
// Document indexle
Product product = new Product("Kablosuz Kulaklık", 599.99, "Elektronik");
IndexResponse response = client.index(i -> i
.index("products")
.id("101")
.document(product)
);
// Arama yap
SearchResponse<Product> search = client.search(s -> s
.index("products")
.query(q -> q
.match(m -> m
.field("name")
.query("kulaklık")
)
),
Product.class
);
search.hits().hits().forEach(hit ->
System.out.println(hit.source().getName() + " — Score: " + hit.score())
);Spring Data Elasticsearch
Spring Boot projelerinde JPA benzeri bir deneyim:
@Document(indexName = "products")
public class Product {
@Id
private String id;
@Field(type = FieldType.Text)
private String name;
@Field(type = FieldType.Float)
private Float price;
@Field(type = FieldType.Keyword)
private String category;
}
public interface ProductRepository extends ElasticsearchRepository<Product, String> {
List<Product> findByName(String name);
List<Product> findByCategoryAndPriceBetween(String category, Float min, Float max);
@Query("{\"match\": {\"name\": {\"query\": \"?0\", \"fuzziness\": \"AUTO\"}}}")
List<Product> searchByName(String name);
}⚠️ Dikkat: Spring Data Elasticsearch versiyonunu Elasticsearch versiyonuyla uyumlu seçmelisin. Spring Boot 3.x → Elasticsearch 8.x. Versiyon uyumsuzluğu en sık karşılaşılan hatadır.
9. Elasticsearch vs RDBMS
İkisi farklı problemleri çözer — rakip değil, tamamlayıcıdır.
| Kriter | Elasticsearch | RDBMS (PostgreSQL, MySQL) |
|---|---|---|
| Arama | Full-text, fuzzy, scoring ✅ | LIKE — yavaş, basit ❌ |
| Transaction | Yok ❌ | ACID ✅ |
| Join | Yok (denormalize model) ❌ | Güçlü JOIN ✅ |
| Tutarlılık | Eventually consistent | Strongly consistent ✅ |
| Aggregation | Çok güçlü ✅ | GROUP BY — yeterli |
| Ölçekleme | Yatay (node ekle) ✅ | Dikey (güçlü makine) |
Ne zaman Elasticsearch? Full-text arama, log analizi, aggregation, real-time dashboard, geo search.
Ne zaman RDBMS? Transaction bütünlüğü, ilişkisel veri, veri tutarlılığı, complex JOIN.
En yaygın mimari — ikisini birlikte kullan:
Kullanıcı arama yapar → Elasticsearch (hızlı arama)
Kullanıcı sipariş verir → PostgreSQL (transaction güvenliği)
PostgreSQL ──(Debezium/Logstash)──→ Elasticsearch💡 İpucu: Elasticsearch'ü source of truth olarak kullanma. Asıl veri RDBMS'te olsun, Elasticsearch arama/analitik katmanı olarak çalışsın.
10. Performans İpuçları
1. Mapping'i Önceden Tanımla
Otomatik mapping genellikle kötü sonuç verir — string alanı hem text hem keyword olarak indexlenir, depolama iki katına çıkar.
2. Bulk API Kullan
Tek tek ekleme yerine toplu ekleme — performans farkı 10-100x:
curl -X POST "http://localhost:9200/_bulk" -H "Content-Type: application/x-ndjson" -d '
{"index": {"_index": "products", "_id": "1"}}
{"name": "Ürün 1", "price": 100, "category": "Elektronik"}
{"index": {"_index": "products", "_id": "2"}}
{"name": "Ürün 2", "price": 200, "category": "Giyim"}
{"index": {"_index": "products", "_id": "3"}}
{"name": "Ürün 3", "price": 300, "category": "Elektronik"}
'3. Filter Context Kullan
must yerine filter: cache'lenir, score hesaplanmaz → daha hızlı.
4. Shard Sayısını Doğru Belirle
Her shard 10-50GB arasında olmalı. 1M document → 1 shard yeterli. 100M document → 5-10 shard. Çok fazla shard = overhead.
5. refresh_interval Ayarla
Yoğun yazma sırasında varsayılan 1s'yi artır:
curl -X PUT "http://localhost:9200/products/_settings" -H "Content-Type: application/json" -d '{
"index": { "refresh_interval": "30s" }
}'6. JVM Heap Size
RAM'in yarısını heap'e ver, yarısını OS file cache'e bırak. 32GB'ı geçme (Compressed Oops sınırı). Min ve max aynı olsun: -Xms16g -Xmx16g.
⚠️ Dikkat: Performans sorunlarının %80'i yanlış shard planlama, eksik mapping ve yetersiz heap ayarından kaynaklanır.
11. Sıkça Sorulan Sorular (SSS)
Elasticsearch ücretsiz mi?
Evet, çekirdek özellikleri ücretsiz ve açık kaynaklıdır (SSPL ve Elastic License 2.0). Temel arama, aggregation, clustering ücretsiz. Gelişmiş güvenlik (RBAC, SSO), machine learning gibi özellikler ücretli lisans gerektirir. Elastic Cloud (yönetimli servis) ücretlidir ama 14 günlük deneme sunar.
Elasticsearch ne kadar RAM ister?
Geliştirme ortamı minimum 2GB, production 8GB+. Tipik production kurulumları 16-64GB arası. Heap size toplam RAM'in yarısını geçmemeli, 32GB'dan fazla olmamalı. Geri kalan RAM, performans için kritik olan file system cache'e kalır.
Elasticsearch ile MongoDB arasındaki fark nedir?
MongoDB genel amaçlı NoSQL veritabanı — CRUD, transaction, esnek şema. Elasticsearch ise öncelikle bir arama ve analitik motoru — full-text search, relevance scoring, aggregation konusunda çok daha güçlü. Farklı işler için optimize edilmişlerdir: veri depolamak için MongoDB, arama ve analitik için Elasticsearch.
Elasticsearch alternatifleri nelerdir?
Apache Solr (Lucene tabanlı, daha eski), OpenSearch (ES 7.10 fork'u, AWS), Meilisearch (hafif, küçük projeler), Typesense (developer-friendly), Algolia (SaaS). Büyük ölçekli kurumsal projeler için Elasticsearch hâlâ en yaygın tercih.
Elasticsearch öğrenmek ne kadar sürer?
Temel kavramlar (CRUD, basit sorgular) 1-2 hafta. Aggregation, mapping optimizasyonu 1-2 ay. Production-grade mimari ve performans optimizasyonu 3-6 ay pratik gerektirir.
Özet
Elasticsearch, Lucene üzerine inşa edilmiş dağıtık bir arama ve analitik motorudur. Inverted index sayesinde milyarlarca document içinde milisaniyede arama yapar.
Temel kavramlar: Index (tablo), Document (satır), Shard (parça), Replica (kopya).
ELK Stack (Elasticsearch + Logstash + Kibana) log analizi ve monitoring için endüstri standardıdır.
RDBMS değildir — transaction yok, JOIN yok. Ama full-text search ve aggregation için eşsiz. En iyi pratik: RDBMS + Elasticsearch birlikte.
Performansın %80'i doğru mapping, doğru shard planlama ve heap ayarından gelir.
Java ekosistemiyle mükemmel entegre olur — resmi Java Client veya Spring Data Elasticsearch ile production uygulamalar geliştirebilirsin.
Elasticsearch Öğrenmeye Devam Et 🚀
Bu makale sana sağlam bir temel kazandırdı, ama Elasticsearch'ün derinliklerine inmek daha fazla pratik gerektiriyor.
tolgahan.dev'de 84 derslik ücretsiz Elasticsearch kursu var. Sıfırdan başlayıp production-grade bilgiye ulaşmanı sağlayan kapsamlı bir müfredat: kurulum, CRUD, mapping, aggregation, ELK Stack, Java entegrasyonu, performans optimizasyonu ve gerçek dünya projeleri — hepsi adım adım.
👉 [Elasticsearch Sıfırdan Uzmanlığa — Ücretsiz Kurs](/courses/elasticsearch-sifirdan-uzmanliga)
Hemen başla, bir Docker container ayağa kaldır, veri yükle, sorgula, kır, tamir et. Elasticsearch öğrenmenin en iyi yolu elini kirletmek. İyi çalışmalar! 💪
Bu yazıyı beğendiniz mi?
Bültene abone olun ve yeni yazılardan ilk siz haberdar olun. Spam yok, söz.
İlgili Yazılar
SQL Cheatsheet: Temel ve İleri Seviye SQL Komutları Rehberi
SELECT, JOIN, Window Functions, Transaction ve daha fazlası — kapsamlı SQL cheatsheet rehberi. Kod örnekleri, performans...
Spring Boot 3'te Exception Handling: Kapsamlı Rehber
Spring Boot 3 ile gelen RFC 7807 ProblemDetail desteği, @ControllerAdvice ile global exception handling ve validation er...
Java'da Stream API: Pratik Kullanım Rehberi
Java Stream API ile filter, map, reduce, collect, flatMap, groupingBy operasyonlarını pratik örneklerle öğrenin. Paralle...