İçeriğe geç

Elasticsearch Nedir? Kapsamlı Başlangıç Rehberi 2026

T
Tolgahan
· · 16 dk okuma · 203 görüntülenme

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 — curl yeter.

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

ÖzellikAçıklama
Full-Text SearchTypo toleransı, eş anlamlılar, stemming ile akıllı arama
Near Real-TimeVeri eklendikten ~1 saniye sonra aranabilir
Dağıtık MimariOtomatik sharding ve replication
Schema-FreeVeri yapısını önceden tanımlamak zorunlu değil (ama önerilir)
RESTful APIJSON over HTTP — dil bağımsız
AggregationSQL 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:

TerimDö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:

  1. Character Filters: Özel karakterleri temizler (HTML tag'leri kaldır)

  2. Tokenizer: Metni kelime kelime parçalar

  3. 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 standard analyzer 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:

  1. Yüksek erişilebilirlik: Node çökerse replica devam eder

  2. 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

ElasticsearchSQL KarşılığıAçıklama
IndexTableDocument'ların toplandığı yer
DocumentRowTek bir veri kaydı (JSON)
FieldColumnDocument içindeki alan
MappingSchemaAlanların veri tiplerini tanımlar
ShardPartitionVerinin fiziksel parçası
ClusterDatabase ServerNode'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.0

Kontrol 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"
}'
# 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: filter içindeki koşullar cache'lenir ve score hesaplanmaz — must'a göre çok daha hızlıdır. Score gerekmiyorsa her zaman filter kullan.

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ı

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şenRolAnaloji
ElasticsearchDepolama ve aramaBeyin — bilgiyi saklar ve bulur
LogstashVeri toplama ve dönüştürmeKulaklar — kaynaklardan veri toplar
KibanaGörselleştirmeGö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.

KriterElasticsearchRDBMS (PostgreSQL, MySQL)
AramaFull-text, fuzzy, scoring ✅LIKE — yavaş, basit ❌
TransactionYok ❌ACID ✅
JoinYok (denormalize model) ❌Güçlü JOIN ✅
TutarlılıkEventually consistentStrongly consistent ✅
AggregationÇok güçlü ✅GROUP BY — yeterli
ÖlçeklemeYatay (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! 💪

Paylaş:
Son güncelleme: Jul 19, 2026

Yorumlar

Giriş yapın ve yorum bırakın.

Henüz yorum yok

Düşüncelerinizi paylaşan ilk siz olun!

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