Elasticsearch ile Veri Etkileşimi: CRUD Operasyonları
Giriş
Günümüzün hızla büyüyen veri dünyasında, büyük hacimli verileri depolamak, aramak ve analiz etmek kritik bir ihtiyaç haline gelmiştir. Geleneksel ilişkisel veritabanları belirli senaryolarda yetersiz kalırken, NoSQL çözümleri bu alanda önemli avantajlar sunmaktadır. Elasticsearch, dağıtık, RESTful ve güçlü bir arama ve analiz motoru olarak bu çözümlerin başında gelir. Gerçek zamanlı arama, log analizi, metrik toplama ve daha birçok kullanım durumu için tercih edilen Elasticsearch, esnekliği ve performansı ile öne çıkar. Bu makalede, Elasticsearch ile veri etkileşiminin temelini oluşturan CRUD (Create, Read, Update, Delete) operasyonlarını derinlemesine inceleyeceğiz. Elasticsearch’ün veri depolama mantığından başlayarak, her bir CRUD operasyonunu detaylandıracak, pratik curl örnekleri ile pekiştirecek ve en iyi uygulamalara değineceğiz.
Elasticsearch Temelleri
Elasticsearch, verileri JSON formatındaki dokümanlar olarak saklar. Bu dokümanlar, indeks adı verilen mantıksal gruplar içinde düzenlenir. Bir doküman, bir veritabanındaki bir satıra, bir indeks ise bir tabloya benzetilebilir. Ancak bu benzetme, Elasticsearch’ün dağıtık yapısı ve şemasız (schemaless) yaklaşımı nedeniyle sınırlıdır.
Doküman Kavramı
Elasticsearch’teki en küçük veri birimi bir “doküman”dır. Her doküman, JSON formatında yapılandırılmış verilerden oluşur. Örneğin, bir ürün bilgisi, bir kullanıcı profili veya bir log kaydı birer doküman olabilir. Her dokümanın, indeks içinde benzersiz bir _id‘si bulunur. Bu _id, dokümana erişim için birincil anahtar görevi görür. Elasticsearch, dokümanları varsayılan olarak dinamik bir şema (mapping) ile indeksler, yani verinin yapısını kendiliğinden algılar ve uygun alan tiplerini atar.
{
"urun_adi": "Akıllı Telefon X",
"marka": "TechCo",
"fiyat": 999.99,
"stok": 150,
"ozellikler": ["6.1 inç ekran", "128 GB depolama", "Çift kamera"],
"eklenme_tarihi": "2023-10-26T10:00:00Z"
}
Yukarıdaki örnek, bir ürün dokümanının JSON yapısını göstermektedir.
Index Kavramı
Bir indeks, benzer özelliklere sahip dokümanların toplandığı bir koleksiyondur. İlişkisel veritabanlarındaki tablolar gibi düşünülebilir, ancak daha esnektir. Bir indeks, kendi içinde shard’lara (parçalara) ayrılabilir ve bu shard’lar birden fazla sunucuya dağıtılarak yatay ölçeklenebilirlik sağlanır. Her indeks, kendi mapping’ine ve ayarlarına sahiptir. Elasticsearch 7.x ve sonraki sürümlerde, _type kavramı tamamen kaldırılmış olup, tüm dokümanlar doğrudan bir indeks altında depolanır.
Mapping Kavramı
Mapping, bir indeks içindeki dokümanların alanlarının nasıl depolanacağını ve indeksleneceğini tanımlayan şemadır. Elasticsearch, bir dokümanı ilk kez indekslediğinde, alanların veri tiplerini otomatik olarak tahmin ederek dinamik bir mapping oluşturur. Ancak, arama ve analiz performansını optimize etmek için özel mapping tanımlamak genellikle daha iyidir. Örneğin, bir metin alanının tam metin araması için mi, yoksa sadece filtrelenebilir bir anahtar kelime olarak mı kullanılacağını mapping ile belirtebiliriz.
PUT /urunler
{
"mappings": {
"properties": {
"urun_adi": { "type": "text" },
"marka": { "type": "keyword" },
"fiyat": { "type": "float" },
"stok": { "type": "integer" },
"eklenme_tarihi": { "type": "date", "format": "strict_date_optional_time||epoch_millis" }
}
}
}
Bu örnekte, urunler indeksine özel bir mapping tanımlanmıştır. urun_adi text olarak, marka keyword olarak, fiyat float olarak vb. belirtilmiştir. text alanlar analiz edilirken (kelimelere ayrılır), keyword alanlar tam değer olarak indekslenir ve genellikle filtreleme ve sıralama için kullanılır.
Veri Oluşturma (Create) Operasyonları
Elasticsearch’e yeni doküman ekleme işlemine “indeksleme” denir. İki ana yöntemle doküman oluşturulabilir: otomatik ID ile veya kullanıcı tanımlı ID ile.
Yeni Doküman Ekleme (Indexleme)
Otomatik ID ile Ekleme
Elasticsearch’ün otomatik olarak benzersiz bir _id oluşturmasını istiyorsanız, POST metodunu kullanırsınız. Bu yöntem, özellikle log verileri veya sensör verileri gibi her zaman yeni ve benzersiz dokümanlar oluşturulduğunda kullanışlıdır.
POST /urunler/_doc
{
"urun_adi": "Akıllı Telefon Y",
"marka": "GlobalTech",
"fiyat": 799.00,
"stok": 200,
"ozellikler": ["6.5 inç ekran", "256 GB depolama", "Üçlü kamera"],
"eklenme_tarihi": "2023-10-26T11:30:00Z"
}
Yanıt olarak, Elasticsearch oluşturulan dokümanın _index, _id, _version ve result (oluşturulduğunu belirten created) bilgilerini döndürür.
{
"_index": "urunler",
"_id": "abcXYZ123...",
"_version": 1,
"result": "created",
"_shards": {
"total": 2,
"successful": 1,
"failed": 0
},
"_seq_no": 0,
"_primary_term": 1
}
Kullanıcı Tanımlı ID ile Ekleme
Eğer dokümanın _id‘sini kendiniz belirlemek istiyorsanız, PUT metodunu kullanırsınız. Bu yöntem, veritabanınızda zaten birincil anahtarları olan verileri Elasticsearch’e aktarırken veya belirli bir ID ile dokümanlara doğrudan erişmek istediğinizde tercih edilir.
PUT /urunler/_doc/urun_001
{
"urun_adi": "Akıllı Saat Z",
"marka": "WearableCo",
"fiyat": 299.50,
"stok": 50,
"ozellikler": ["1.5 inç AMOLED ekran", "Kalp atış hızı sensörü"],
"eklenme_tarihi": "2023-10-26T12:00:00Z"
}
Bu istek, urun_001 ID’sine sahip bir dokümanı oluşturur. Eğer bu ID’ye sahip bir doküman zaten varsa, bu istek mevcut dokümanı tamamen yeni veri ile değiştirir (günceller). Bu, PUT operasyonunun idempotent (tekrarlanabilir) olduğu anlamına gelir. Yanıt, otomatik ID ile eklemedeki gibi _index, _id, _version ve result (oluşturulduysa created, güncellendiyse updated) bilgilerini içerir.
Toplu Ekleme (Bulk API)
Tek tek doküman eklemek, büyük veri kümeleri için verimsiz olabilir. Elasticsearch, birden fazla indeksleme, güncelleme veya silme işlemini tek bir istekte gerçekleştirmek için _bulk API’sini sunar. Bu, ağ gecikmesini azaltarak performansı önemli ölçüde artırır.
_bulk API’si, her satırın bir JSON nesnesi olduğu özel bir format kullanır. Her işlem iki satırdan oluşur: ilk satır işlemi (index, create, update, delete) ve meta verileri (_index, _id gibi) tanımlar, ikinci satır ise dokümanın kendisidir (delete işlemi hariç).
POST /_bulk
{"index": {"_index": "urunler", "_id": "urun_002"}}
{"urun_adi": "Kablosuz Kulaklık", "marka": "AudioPro", "fiyat": 149.99, "stok": 300, "eklenme_tarihi": "2023-10-26T13:00:00Z"}
{"create": {"_index": "urunler", "_id": "urun_003"}}
{"urun_adi": "Taşınabilir Şarj Cihazı", "marka": "PowerUp", "fiyat": 49.00, "stok": 500, "eklenme_tarihi": "2023-10-26T13:15:00Z"}
{"delete": {"_index": "urunler", "_id": "urun_001"}}
{"update": {"_index": "urunler", "_id": "urun_002"}}
{"doc": {"stok": 280}}
_bulk API’si, başarılı ve başarısız tüm işlemlerin sonuçlarını içeren tek bir yanıt döndürür. Bu yanıtı dikkatlice inceleyerek her bir işlemin durumunu kontrol etmek önemlidir.
Veri Okuma (Read) Operasyonları
Elasticsearch’ten veri okuma, tek bir dokümanı ID ile getirmekten, karmaşık sorgularla milyonlarca dokümanı filtrelemeye kadar geniş bir yelpazeyi kapsar.
Tek Doküman Okuma (Get API)
Belirli bir ID’ye sahip tek bir dokümanı almak için GET metodunu kullanırız.
GET /urunler/_doc/urun_002
Yanıt, dokümanın _index, _id, _version, _seq_no, _primary_term ve _source alanlarını içerir. _source alanı, dokümanın orijinal JSON içeriğidir. Ayrıca, dokümanın bulunup bulunmadığını belirten found alanı da yer alır.
{
"_index": "urunler",
"_id": "urun_002",
"_version": 2,
"_seq_no": 1,
"_primary_term": 1,
"found": true,
"_source": {
"urun_adi": "Kablosuz Kulaklık",
"marka": "AudioPro",
"fiyat": 149.99,
"stok": 280,
"eklenme_tarihi": "2023-10-26T13:00:00Z"
}
}
_source Filtreleme
Bazı durumlarda, dokümanın tüm _source‘una değil, sadece belirli alanlarına ihtiyacımız olabilir. Bu, ağ trafiğini azaltmak ve performansı artırmak için kullanışlıdır.
GET /urunler/_doc/urun_002?_source_include=urun_adi,fiyat
Bu istek sadece urun_adi ve fiyat alanlarını döndürecektir. Benzer şekilde, _source_exclude ile belirli alanları hariç tutabilirsiniz.
Tüm Dokümanları Okuma (Search API)
Elasticsearch’ün gücünün büyük bir kısmı, _search API’sinde yatar. Bu API, karmaşık sorgularla indekslenmiş dokümanları aramanıza olanak tanır.
Basit Arama
Bir indeksteki tüm dokümanları almak için boş bir sorgu kullanabilirsiniz. Ancak bu, büyük indeksler için önerilmez.
GET /urunler/_search
Yanıt, hits objesi içinde arama sonuçlarını (dokümanları) içerir. Her bir hit, dokümanın _index, _id, _score (alakalı puanı) ve _source‘unu içerir.
Sorgu DSL (Query Domain Specific Language)
Elasticsearch, JSON tabanlı güçlü bir sorgu dili olan Query DSL’i kullanır. Bu dil, çeşitli sorgu tipleri ve filtreleme seçenekleri sunar.
* match_all Query: Tüm dokümanları döndürür.
GET /urunler/_search
{
"query": {
"match_all": {}
}
}
* match Query: Belirli bir alanda tam metin araması yapar. Metin alanları için analizörler kullanılarak kelime eşleşmeleri bulunur.
GET /urunler/_search
{
"query": {
"match": {
"urun_adi": "akıllı telefon"
}
}
}
* term Query: Belirli bir alanda tam, eşleşen bir terimi arar. keyword alanları için idealdir ve analizör kullanmaz.
GET /urunler/_search
{
"query": {
"term": {
"marka": "AudioPro"
}
}
}
term sorgusu, text alanlarında beklenmedik sonuçlar verebilir çünkü text alanları indekslenirken kelimelere ayrılır (tokenize edilir). Bu nedenle, term sorgularını genellikle keyword veya diğer yapılandırılmış alanlarda kullanmak daha doğrudur.
* bool Query: Birden fazla sorguyu mantıksal operatörlerle (AND, OR, NOT) birleştirmenizi sağlar.
* must: Tüm sorguların eşleşmesi gerekir (AND).
* should: En az bir sorgunun eşleşmesi gerekir (OR).
* must_not: Sorguların eşleşmemesi gerekir (NOT).
* filter: Sorguların eşleşmesi gerekir, ancak puanlama (scoring) yapmaz, bu da performansı artırır.
GET /urunler/_search
{
"query": {
"bool": {
"must": [
{ "match": { "urun_adi": "kulaklık" } }
],
"filter": [
{ "range": { "fiyat": { "lte": 150 } } }
],
"must_not": [
{ "term": { "marka": "TechCo" } }
]
}
}
}
Bu sorgu, urun_adi‘nda “kulaklık” geçen, fiyatı 150’den küçük veya eşit olan ve markası “TechCo” olmayan ürünleri bulur.
Pagination (Sayfalama)
Arama sonuçlarını belirli bir boyutta ve başlangıç noktasından itibaren almak için from ve size parametrelerini kullanırız.
GET /urunler/_search
{
"query": { "match_all": {} },
"from": 0,
"size": 10
}
Bu, ilk 10 sonucu getirir. from değerini artırarak sonraki sayfaları alabilirsiniz.
Sorting (Sıralama)
Sonuçları belirli alanlara göre sıralamak için sort parametresi kullanılır.
GET /urunler/_search
{
"query": { "match_all": {} },
"sort": [
{ "fiyat": { "order": "desc" } },
{ "urun_adi.keyword": { "order": "asc" } }
]
}
Bu sorgu, önce fiyata göre azalan, sonra ürün adına göre artan şekilde sıralar. Metin alanlarını sıralarken genellikle keyword versiyonunu kullanmak gerekir, çünkü text alanları analiz edildiği için sıralama beklenen sonuçları vermeyebilir.
Aggregations (Kümelemeler)
Elasticsearch’ün en güçlü özelliklerinden biri de kümelemelerdir. Kümelemeler, arama sonuçları üzerinde gruplandırma, sayma, ortalama alma gibi istatistiksel analizler yapmaya olanak tanır.
GET /urunler/_search
{
"size": 0,
"aggs": {
"markalara_gore_urun_sayisi": {
"terms": {
"field": "marka.keyword",
"size": 10
}
},
"ortalama_fiyat": {
"avg": {
"field": "fiyat"
}
}
}
}
Bu sorgu, markalara göre ürün sayılarını ve tüm ürünlerin ortalama fiyatını hesaplar. size: 0 ile dokümanların kendisini getirmeyip sadece kümeleme sonuçlarını alabiliriz.
Multi Get API
Birden fazla dokümanı ID’lerine göre tek bir istekte almak için _mget API’si kullanılır. Bu, _bulk API’sine benzer şekilde ağ gecikmesini azaltarak verimlilik sağlar.
GET /_mget
{
"docs": [
{
"_index": "urunler",
"_id": "urun_002"
},
{
"_index": "urunler",
"_id": "abcXYZ123..."
}
]
}
Veri Güncelleme (Update) Operasyonları
Elasticsearch’te doküman güncelleme, kısmi güncelleme veya tamamen değiştirme şeklinde yapılabilir.
Kısmi Güncelleme (Update API)
_update API’si, mevcut bir dokümanın sadece belirli alanlarını değiştirmek için kullanılır. Bu, dokümanın tamamını yeniden indekslemekten daha verimlidir.
POST /urunler/_update/urun_002
{
"doc": {
"stok": 250,
"son_guncelleme": "2023-10-26T14:00:00Z"
}
}
Bu istek, urun_002 ID’sine sahip dokümanın stok ve son_guncelleme alanlarını günceller. Diğer alanlar değişmeden kalır.
Script ile Güncelleme
Daha karmaşık güncelleme senaryoları için, script kullanarak dokümanları güncelleyebilirsiniz. Örneğin, bir sayacı artırmak veya koşullu güncellemeler yapmak için.
POST /urunler/_update/urun_002
{
"script": {
"source": "ctx._source.stok += params.miktar",
"lang": "painless",
"params": {
"miktar": -10
}
}
}
Bu script, urun_002 dokümanının stok alanını 10 azaltır. ctx._source mevcut dokümanı temsil eder.
Upsert (Ekle veya Güncelle)
Eğer güncellemek istediğiniz doküman mevcut değilse, yeni bir doküman oluşturmak için upsert seçeneğini kullanabilirsiniz.
POST /urunler/_update/yeni_urun_id
{
"script": {
"source": "ctx._source.stok += params.miktar",
"lang": "painless",
"params": {
"miktar": 50
}
},
"upsert": {
"urun_adi": "Yeni Ürün",
"marka": "NewBrand",
"fiyat": 100.00,
"stok": 50,
"eklenme_tarihi": "2023-10-26T15:00:00Z"
}
}
Eğer yeni_urun_id mevcut değilse, upsert içindeki doküman oluşturulur. Eğer mevcutsa, script çalıştırılır.
Tam Dokümanı Değiştirme (Re-indexing)
Bir dokümanın tamamını yeni bir dokümanla değiştirmek isterseniz, PUT metodunu kullanabilirsiniz. Bu, aslında bir “create” operasyonu gibi çalışır ancak aynı ID’ye sahip bir doküman varsa, eskisini silip yerine yenisini koyar.
PUT /urunler/_doc/urun_002
{
"urun_adi": "Kablosuz Kulaklık Pro",
"marka": "AudioPro",
"fiyat": 199.99,
"stok": 240,
"ozellikler": ["Gürültü Engelleme", "Uzun Pil Ömrü"],
"eklenme_tarihi": "2023-10-26T13:00:00Z",
"son_guncelleme": "2023-10-26T16:00:00Z"
}
Bu işlem, urun_002 ID’li mevcut dokümanın tüm içeriğini yukarıdaki JSON ile değiştirir. _version numarası artırılır.
Query ile Toplu Güncelleme (Update By Query API)
Belirli bir sorguyla eşleşen birden fazla dokümanı aynı anda güncellemek için _update_by_query API’si kullanılır. Bu, büyük veri kümeleri üzerinde toplu değişiklikler yapmak için çok güçlü bir araçtır.
POST /urunler/_update_by_query
{
"query": {
"match": {
"marka": "AudioPro"
}
},
"script": {
"source": "ctx._source.fiyat *= 1.10",
"lang": "painless"
}
}
Bu istek, markası “AudioPro” olan tüm ürünlerin fiyatını %10 artırır. _update_by_query asenkron bir işlem olabilir ve büyük veri kümelerinde uzun sürebilir. İşlemin durumunu takip etmek için _tasks API’si kullanılabilir.
Veri Silme (Delete) Operasyonları
Elasticsearch’ten doküman silme, tekil dokümanları veya sorguyla eşleşen dokümanları silme şeklinde gerçekleştirilebilir.
Tek Doküman Silme (Delete API)
Belirli bir ID’ye sahip tek bir dokümanı silmek için DELETE metodunu kullanırız.
DELETE /urunler/_doc/abcXYZ123...
Yanıt, silme işleminin başarılı olup olmadığını (result: deleted), _index, _id ve _version bilgilerini içerir. Eğer doküman bulunamazsa, result: not_found döner.
Tüm Index’i Silme
Bir indeksi ve içindeki tüm dokümanları tamamen silmek için, indeksin adına DELETE isteği gönderilir. Bu işlem geri alınamaz ve dikkatli kullanılmalıdır.
DELETE /urunler
Bu istek, urunler indeksini ve içindeki tüm dokümanları siler.
Query ile Toplu Silme (Delete By Query API)
Belirli bir sorguyla eşleşen birden fazla dokümanı aynı anda silmek için _delete_by_query API’si kullanılır.
POST /urunler/_delete_by_query
{
"query": {
"range": {
"stok": {
"lte": 0
}
}
}
}
Bu istek, stoğu 0 veya daha az olan tüm ürün dokümanlarını siler. _delete_by_query de _update_by_query gibi asenkron çalışabilir.
Gelişmiş Konular ve En İyi Uygulamalar
CRUD operasyonlarını etkili bir şekilde kullanmak için bazı gelişmiş konuları ve en iyi uygulamaları bilmek faydalıdır.
Versiyonlama (Optimistic Concurrency)
Elasticsearch, her dokümanın bir _version numarası tutar. Her güncelleme veya silme işleminde bu numara artırılır. Bu mekanizma, iyimser eşzamanlılık kontrolü (optimistic concurrency control) sağlar. Yani, iki istemcinin aynı anda aynı dokümanı güncellemeye çalışmasını engeller. Eğer bir istemci eski bir _version numarasıyla güncelleme yapmaya çalışırsa, Elasticsearch bir çakışma hatası (Conflict (409)) döndürür.
Daha gelişmiş eşzamanlılık kontrolü için if_seq_no ve if_primary_term parametreleri kullanılabilir. Bu parametreler, dokümanın _seq_no ve _primary_term değerlerinin belirli bir değerle eşleşmesi durumunda işlemin gerçekleşmesini sağlar.
PUT /urunler/_doc/urun_002?if_seq_no=2&if_primary_term=1
{
"urun_adi": "Kablosuz Kulaklık Pro Max",
"marka": "AudioPro",
"fiyat": 249.99,
"stok": 230
}
Bu istek, sadece urun_002 dokümanının _seq_no‘su 2 ve _primary_term‘i 1 ise başarılı olur.
Yenileme (Refresh) Mekanizması
Elasticsearch “near real-time” (neredeyse gerçek zamanlı) bir sistemdir. Bir dokümanı indekslediğinizde veya güncellediğinizde, hemen arama sonuçlarında görünmeyebilir. Bu durum, dokümanların arama için kullanılabilir hale gelmeden önce bir “refresh” (yenileme) işlemi gerektirmesinden kaynaklanır. Varsayılan olarak, indeksler her saniyede bir yenilenir.
Anlık görünürlük gerektiren senaryolarda, indeksleme veya güncelleme isteğine ?refresh=true parametresini ekleyebilirsiniz:
POST /urunler/_doc?refresh=true
{
"urun_adi": "Hızlı Ürün",
"marka": "FastCo",
"fiyat": 10.00
}
Ancak, refresh=true her istekte kullanıldığında performans düşüşüne neden olabilir, çünkü her yenileme işlemi kaynak tüketir. Bu nedenle, sadece gerçekten ihtiyaç duyulduğunda kullanılmalıdır.
Hata Yönetimi
Elasticsearch API’si, HTTP durum kodlarını (örneğin, 200 OK, 201 Created, 404 Not Found, 409 Conflict, 500 Internal Server Error) ve detaylı JSON hata mesajlarını kullanarak hata durumlarını bildirir. Uygulamalarınızda bu hata kodlarını ve mesajlarını doğru bir şekilde işlemek, sağlam bir sistem için kritiktir.
Güvenlik
Elastic Stack’in güvenlik özellikleri (X-Pack Security), kimlik doğrulama, yetkilendirme, şifreleme ve denetim gibi yetenekler sunar. Üretim ortamlarında Elasticsearch’ü kullanırken bu güvenlik özelliklerini etkinleştirmek ve yapılandırmak zorunludur. API anahtarları, rol tabanlı erişim kontrolü gibi mekanizmalarla verilere erişimi kısıtlamak önemlidir.
Performans İpuçları
* Bulk API Kullanımı: Büyük veri kümelerini indekslerken, güncellerken veya silerken her zaman _bulk API’sini kullanın. Tekil isteklerden kat kat daha hızlıdır.
* Doğru Mapping: Veri tiplerini ve analizörleri doğru bir şekilde tanımlamak, arama ve indeksleme performansını doğrudan etkiler. keyword ve text alanları arasındaki farkı iyi anlamak ve doğru yerde kullanmak önemlidir.
* Filtreleri Etkili Kullanma: bool sorgularında filter bağlamını kullanmak, puanlama maliyetinden kaçınarak sorgu performansını artırır.
* Yenileme Aralıkları: refresh_interval ayarını uygulamanızın gereksinimlerine göre ayarlayın. Anlık görünürlük gerekmeyen durumlarda bu aralığı artırmak, indeksleme performansını iyileştirir.
* Shard ve Replica Sayısı: İndekslerinizin shard ve replica sayılarını doğru yapılandırmak, hem performans hem de veri güvenliği için hayati öneme sahiptir.
* Cache Mekanizmaları: Elasticsearch’ün sorgu önbelleği gibi dahili önbellekleme mekanizmalarını anlamak ve kullanmak, tekrar eden sorguların performansını artırabilir.
Sonuç
Elasticsearch, modern veri odaklı uygulamalar için güçlü ve esnek bir platform sunar. Bu makalede ele aldığımız CRUD operasyonları (Create, Read, Update, Delete), Elasticsearch ile veri etkileşiminin temel taşlarıdır. Dokümanların nasıl indekslendiğini, çeşitli sorgu türleriyle nasıl arandığını, kısmi veya toplu güncellemelerin nasıl yapıldığını ve verilerin nasıl silindiğini anlamak, bu güçlü arama motorundan en iyi şekilde yararlanmanın anahtarıdır. curl örnekleriyle pratik uygulamaları gösterdik ve performans, güvenlik ve eşzamanlılık gibi önemli konulara değindik. Elasticsearch’ün sunduğu Query DSL ve Aggregations gibi gelişmiş özellikler, verilerinizden anlamlı içgörüler elde etmenizi sağlayarak uygulamanızın değerini artıracaktır. Bu temel bilgileri kullanarak, karmaşık veri yönetimi ve arama senaryolarını kolayca hayata geçirebilirsiniz.
