Elasticsearch: Yüksek Performanslı Arama ve Analiz İçin Temel Bilgiler [1/5]

Elasticsearch: The Basics for High Performance Search and Analysis [1/5]

Cihat Solak
Intertech
9 min readOct 13, 2023

--

Elasticsearch, büyük veri kümelerinde gerçek zamanlı arama yapabilme özelliği ile öne çıkar.

Elasticsearch, açık kaynak bir arama motorudur ve Java programlama diliyle geliştirilmiştir. Elasticsearch veri tabanını diğer veri tabanlarından ayıran özelliklerden biri, metinler üzerinde yapılabilen tam metin arama (full-text search) yeteneğinin güçlü olmasıdır. Bu nedenle, diğer veri tabanlarına kıyasla metinler üzerinde arama yapma (full-text search) performansı daha yüksektir. Örnek olarak, uygulamanızda kullanıcılar tarafından .doc veya .pdf gibi dosyalar yüklendiğini düşünelim. Bu yüklenen dosyalarda “Denizbank” kelimesini aramak istediğinizde, Elasticsearch güçlü bir veritabanıdır ve bu tür büyük veriler üzerinde tam metin arama (full-text search) yapmanıza olanak tanır.

Elasticsearch, verileri JSON formatında kaydeden bir NoSQL veritabanıdır. Odaklandığı temel alan arama motoru (search engine) olduğu için arama yetenekleri son derece güçlüdür. Bu özellik, Elasticsearch’i diğer veritabanlarından ayıran önemli bir özelliktir. Bu nedenle, Elasticsearch’i ilişkisel veya ilişkisel olmayan veritabanlarıyla karıştırmamak önemlidir. Elasticsearch, arka planda açık kaynak bir adlı arama motoru kütüphanesinden faydalanmaktadır.

Apache Lucene, güçlü tam metin arama yetenekleriyle öne çıkan açık kaynaklı bir arama motoru kütüphanesidir.

Apache Lucene’a gelen veya gelebilecek herhangi bir özellik, uygun entegrasyon sağlandığında Elasticsearch tarafında da kullanılabilir.

Elasticsearch bir uygulama (app) iken, Apache Lucene ise bir kütüphanedir.

Ne Zaman Kullanabiliriz?

Özellikle büyük veri setleri üzerinde etkili bir şekilde arama yapabilmek için Elasticsearch tercih edilmektedir. Örneğin, milyonlarca ürünün bulunduğu platformlar, .doc, .pdf gibi dosyalarda arama yapma ihtiyacı, haber ve blog sitelerindeki aramalar için Elasticsearch ideal bir veritabanı çözümü sunar.

Elasticsearch, NoSQL bir veritabanı olduğu için ilişkisel veritabanlarının sahip olduğu veri tutarlılığına dayalı ilişki yapısına sahip değildir ve veriler arasında doğrudan bir ilişki bulunmamaktadır.

Sistemde milyonlarca veri bulunsa bile hızlı arama yapabilmek için indeksleme önemli bir rol oynar. Klasik veritabanlarda da performans artırma amacıyla indeksleme kullanılır. Elasticsearch ise her şeyi indeksler. Örneğin, bir makaledeki her kelimeyi ayrı ayrı indekslediği için arama performansı oldukça yüksektir.

Elasticsearch, search engine olup gücünü apache lucene kütüphanesinden almaktadır.

Search Engine Yetenekleri

Elasticsearch, esnek ve özelleştirilebilir sorgulama özellikleri sayesinde karmaşık arama gereksinimlerini karşılayabilir.
  • Yapılandırılmamış ve yapılandırılmış veriler için arama (Search for unstructered and structured data)
  • Bunu mu demek istediniz tavsiyeleri (Did-you-mean recommendations)
  • Kullanıcıların yazım hatalarının affedilmesi (Forgiveness for users’ spelling mistakes)
  • Coğrafi konumlar ve GeoPoint’lerde arama yetenekleri (Search capabilities on geolocations and GeoPoints)
  • Değişen taleplere göre kolay ölçeklenebilirlik (Easy scalability based on the fluctuating demands)
  • Speedy indexing and search capabilities (Hızlı indeksleme ve arama yetenekleri)
  • Yüksek kullanılabilirliğe sahip ve hataya dayanıklı bir dağıtılmış sistem mimarisi (Architecture that’s a high-availability and fault-tolerant distributed system)

Elasticsearch, hem yapılandırılmış (datetime, boolean, int gibi) veriler üzerinde hem de yapılandırılmamış (unstructured) veriler üzerinde arama yapabilme yeteneğine sahiptir. Örneğin, belirli bir fiyat aralığındaki ürünleri veya belirli tarihler arasındaki ürünleri getirmek gibi yapılandırılmış veriler üzerinde arama yapabilirsiniz. Bu, tipik veri tabanı sorgularıdır ve Elasticsearch bunları etkili bir şekilde gerçekleştirebilir.

Ancak Elasticsearch’in en güçlü yönlerinden biri, yapılandırılmamış veriler üzerinde (tam metin arama olarak da bilinir) arama yapabilme [full-text search] yeteneğidir. Bir metin dosyası üzerinde veya benzeri unstructured verilerde arama yapma konusunda çok yeteneklidir. Bu, Elasticsearch’i belirli bir kelimenin veya ifadenin geçtiği metinleri hızlıca bulabilme kapasitesi ile ayırt eder.

Elasticsearch’ün asıl gücü unstructed veri üzerinde arama yapabilmesidir. Aksi durumda structered veri için diğer veri tabanlarında da çok hızlı sonuçlar alabilirisiniz.

Farklı veri tabanları, yapılandırılmış veya yapılandırılmamış veri üzerinde full-text search yeteneğine sahip olabilirler. Ancak Elasticsearch, özellikle yapılandırılmamış veri üzerinde hızlı sonuçlar elde etme yeteneği konusunda öne çıkar. Bu, Elasticsearch’in veriyi analiz etme ve indeksleme yeteneğine dayanır. Bu nedenle, Elasticsearch, yapılandırılmamış veriler üzerinde etkili bir şekilde arama yapabilir.

Structured veriler, datetime, boolean, int, float gibi belirli değerleri içerebilir. Bu tür veriler üzerinde arama yapmak genellikle kesin sonuçlar verir, örneğin “Var/Yok” veya “Evet/Hayır” gibi. Ancak unstructured veri üzerinde arama yapmak farklıdır. Örnek olarak, onlarca makale içinde “Banka” kelimesi aradığınızda en ilgili sonuçları bulmak istersiniz. Google’da arama yaptığınızda sonuçlar en ilgili olanından en ilgisizine doğru sıralanır. Elasticsearch, unstructured veri üzerinde arama yaparken sonuçları en ilgili olanından en ilgisizine sıralayarak sunar.

“Did you mean?” gibi bir yapı oluşturmayı amaçladığımızda, search engine doğası gereği bu özelliğe sahiptirler. Ayrıca, arama yaparken yazım hataları yapabiliriz. Örneğin, “denizbank” yerine “dnizbank” gibi bir yazım hatası yaptığımızda, Elasticsearch eksik harf hatalarını tolere ederek aramayı gerçekleştirir.

Elasticsearch’in “did you mean” özelliği, kullanıcıların hatalı yazılmış veya benzer terimlerle arama yapmaları durumunda doğru sonuçları önererek arama deneyimini geliştirir.

Coğrafi lokasyon verileri (enlem/boylam), Elasticsearch’in güçlü bir şekilde arama yapabilme yeteneğine sahiptir. Örneğin, harita üzerinde belirlediğiniz bir bölgedeki banka şubelerini hızlıca bulabilirsiniz. Bu nedenle, her banka şubesinin enlem ve boylam bilgisine sahip olması, coğrafi verilerle çalışırken Elasticsearch’in büyük fayda sağladığı bir örnektir.

Elasticsearch, veri tabanı olarak kullanıldığında yüksek talep durumlarında kendisini yatayda ölçeklendirme yeteneği ile dikkat çeker. Bu yetenek, Elasticsearch’in özgün mimarisi ile mümkün kılınmıştır. Elasticsearch’in arama yetenekleri, temel olarak Apache Lucene alt yapısına ve onunla birlikte gelen indeksleme yapısına dayanır. Bu indeksleme süreci, geleneksel veri tabanlarındaki indekslemeden farklı bir yaklaşım benimser. Örneğin, Elasticsearch’e bir metin verdiğinizde içindeki bağlaçlar (örneğin, “ile” veya “ve” gibi) göz ardı edilir, çünkü insanlar arama yaparken genellikle bu bağlaçları kullanmazlar. Ayrıca, metinde tekrar eden kelimeler de aynı bağlaçlar gibi kaldırılır. Geriye kalan kelimeler ayrı ayrı indekslenir ve bunların nerede geçtiği ile ilgili bilgiler kaydedilir. Özetlemek gerekirse, Elasticsearch, öncelikle iletilen metni analiz eder, ardından her kelimeyi ayrı ayrı indeksler.

MySQL ve MSSQL Server, içerik tabanlı tam metin arama yeteneklerini desteklemek için özel olarak tasarlanmış Full Text Search (Tam Metin Arama) işlevlerine sahiptir.

MySQL veya MSSQL’de Full-Text Search Yapamıyor Muyuz?

MSSQL ve MYSQL veri tabanlarınında full-text search yetenekleri bulunmaktadır. ElasticDB, search yapısına odaklanmışken MySQL, MSSQL vb. veri tabanlarının asıl odaklandıkları nokta search değildir. Dolayısıyla hacimli veriler üzerinde arama yapmak istediğimizde akla gelen veri tabanlarından biri elastic veri tabanı olmalıdır.

High Availability (Yüksek Erişilebilirlik) ve Fault Tolerance (Hata Toleransı)

Elasticsearch, yüksek erişilebilirlik (high availability) ve hata tolere edebilirlik (fault tolerance) özelliklerine sahiptir. Yüksek erişilebilirlik, Elasticsearch’in mimarisinin yaklaşık olarak %99.9999 oranında çalışır durumda olacağını garanti etmektedir. Bu, sistem çökmeleri gibi olaylara karşı dirençli olduğu anlamına gelir ve sürekli olarak kullanılabilir olmasını sağlar. Hata tolere edebilirlik ise yüksek erişilebilirliğin bir üst modelidir. Yüksek erişilebilirlik sadece sistemin çalışır durumda olacağını garanti ederken, hata tolere edebilirlik aynı zamanda kısmi hataların (örneğin, bir sanal sunucunun çökmesi) performansa zarar vermeden tolere edileceğini garanti eder.

Yüksek kullanılabilirlik, kesintisiz çalışmayı sağlarken, hata tolere edilebilirlik beklenmedik arızalara karşı direnç göstermeyi ifade eder.

Örnek vermek gerekirse, yüksek erişilebilirlik sistemlerinde bir hata meydana geldiğinde performans düşebilir. Ancak hata tolere edebilirlik destekleniyorsa, herhangi bir kısmi hata (örneğin, bir sanal sunucunun çökmesi) sistem performansını etkilemeden otomatik olarak tolere edilebilir. Bu iki kavram, daha derinlemesine incelendiğinde farklıdır ancak her ikisi de Elasticsearch’in güvenilir bir şekilde çalışmasını sağlamak için önemli özelliklerdir.

High availability’nin maliyeti fault tolerans’dan daha düşüktür. Ancak fault tolerance, high availability’nin upgrade (yükseltmek) edilmiş halidir.

ELASTIC STACK (ELK STACK)

Elasticsearch, diğer ürünlerle birlikte kullanıldığında daha güçlü bir veri analizi ve yönetimi ekosistemi sunar. Bu ürünlerden biri Kibana’dır.

Elastic Stack, veri analizi ve görselleştirmesi için kullanılan açık kaynaklı bir veri platformudur.

Kibana, Elasticsearch içindeki verilere erişim sağlayan bir web ara yüzüdür ve Node.js ile yazılmıştır. Kibana, Elasticsearch verileri üzerinde sorgular yapmak için kendi sorgu diline sahiptir. Bu sorgular, arka planda Elasticsearch’in REST API endpoint’lerine dönüştürülerek iletilir. Kibana, kullanıcıların Elasticsearch verilerini görsel olarak keşfetmelerini, sorgulamalarını ve analiz etmelerini kolaylaştırır. SQL Server ile benzer bir ilişki düşünülebilir, çünkü SQL Server Management Studio gibi bir görsel IDE kullanarak SQL Server veritabanı üzerinde sorgular yapabilirsiniz. Benzer şekilde, Kibana aracılığıyla Elasticsearch üzerinde sorgular yapabilirsiniz.

Logstash ise veri işleme motorudur ve çeşitli kaynaklardan gelen verileri işler, zenginleştirir ve Elasticsearch’e iletmek üzere ayıklar. Logstash, verilerin sadece log olmak zorunda olmadığı birçok farklı formatta gelebileceği bir esneklik sunar. Örneğin, Logstash’i kullanarak belirli bir kritere uyan log kayıtlarını Elasticsearch’e kaydedebilir veya gelen log kayıtlarını filtreleyip tarih bilgisi ekleyerek Elasticsearch’e gönderebilirsiniz. Sonuç olarak, Logstash verilerin işlenmesini kolaylaştırır ve Elasticsearch üzerinde saklanacak şekilde düzenler.

Bu ürünlerin birleşimi, Elasticsearch’in veri yönetimi ve analizi konularında güçlü bir çözüm sunmasına yardımcı olur ve Kibana aracılığıyla verileri görsel olarak analiz etmek için kullanılabilir.

Logstash’e veriler nereden gelecek?

Elastic Beats, veri toplamak ve Elasticsearch veya Logstash’e göndermek için kullanılan hafif, tek başına çalışabilen veri nakil araçlarıdır.

Logstash, verileri çeşitli kaynaklardan alabilir ve Elasticsearch veya diğer hedeflere iletmek üzere işleyebilir. Veriler Logstash’e nereden geleceğine dair farklı yöntemler bulunur. Bazı örnekler:

Direct Input (Doğrudan Giriş): Logstash, doğrudan veri girişi sağlayabilir. Örneğin, bir metin dosyasındaki logları veya verileri doğrudan Logstash’e iletebilirsiniz.

Beats Components (Beat Bileşenleri): Beats, veri toplama ajanlarıdır ve farklı kaynaklardan verileri çekerler. Örneğin:

  • Filebeat: Uygulama logları veya diğer verileri bir dosyada kaydediyorsa, Filebeat bu dosyadaki verileri toplar ve Logstash veya Elasticsearch’e iletebilir.
  • Metricbeat: Sunucu metrik verilerini toplar (örneğin, CPU ve RAM kullanımı) ve bu verileri Logstash veya Elasticsearch’e gönderir.
  • Heartbeat: Uygulamanın sağlığını kontrol etmek için kullanılır. Belirli aralıklarla uygulamanın çalışıp çalışmadığını kontrol eder ve bu bilgileri Logstash veya Elasticsearch’e gönderir.

Logstash, aldığı verileri işler, filtreler ve zenginleştirir, ardından hedefe ileterek bu verilerin analiz edilmesini kolaylaştırır. Elasticsearch veya diğer araçlar bu verileri depolayabilir ve Kibana gibi görsel arayüzler aracılığıyla verileri görüntüleyebilirsiniz.

Bu şekilde, Logstash ve Beats gibi bileşenleri kullanarak veri akışınızı toplayabilir, işleyebilir ve analiz edebilirsiniz.

Beatler, farklı kaynaklardan veri toplama.. Logstash kendisine gelen veriyi işleme.. Elasticsearch veriyi depolama.. Kibana ise veriyi görselleştirme amacıyla kullanılır.

ELASTIC SEARCH TEMEL ÖZELLİKLERİ

  • NoSQL modelini temel alan arama motoru (search engine based on the NoSQL model)
  • Yapılandırılmış ve yapılandırılmamış verilerde arama (search on structured and unstructered data)
  • Analitik (Analytics)
  • Şemadan bağımsız (Scheme free engine (JSON documents))
  • RESTful
HTTP üzerinden yapılandırılmış istekler ve cevaplarla etkileşime geçmek için kullanılır.

Elasticsearch, NoSQL bir veritabanıdır ve şema bağımsız bir yapıya sahiptir. Verileri JSON formatında tutar ve her bir belge (document) farklı sayıda alan (property) içerebilir. Bu, geleneksel ilişkisel veri tabanlarında olduğu gibi sabit bir şema yapısı gerektirmez. Bu özellik, Elasticsearch’i çok çeşitli veri türlerini saklamak ve sorgulamak için esnek bir çözüm haline getirir.

Şema bağımsız olması, veri eklerken her alanın türünü belirtme zorunluluğu olmadığı anlamına gelir. Elasticsearch, eklenen verilere göre alanların türlerini otomatik olarak belirler. Örneğin, ilk değeri Denizbank olarak gönderiyorsanız Elasticsearch, bu alanın bir dize (string) olduğunu anlar. Ancak, üretim ortamında satırların türlerini belirtmek iyi bir uygulama pratiğidir [Best Practices], çünkü bu Elasticsearch’in yeteneklerini daha iyi kullanmanıza ve performansı artırmanıza yardımcı olabilir.

Elasticsearch, hem yapısal (structured) hem de yapısal olmayan (unstructured) veriler üzerinde sorgulama yapabilir. Yapısal veriler kesin sonuçlar sunar ve örneğin 2022–12–25 00:23 veya IsActive gibi değerler içerebilir. Diğer yandan, Elasticsearch, büyük metin dosyaları gibi yapısal olmayan veriler üzerinde de hızlı ve etkili aramalar yapabilir.

Elasticsearch, verileri analiz etmeden önce belirli analiz süreçlerinden geçirebilir. Bu, özellikle metin verileri için önemlidir. Örneğin, bir e-ticaret sitesinde ürün açıklamalarını kaydediyorsanız, Elasticsearch bu veriyi analiz ederek bağlaçları ayrıştırabilir ve indeks tablolarına her kelimenin nerede geçtiğiyle ilgili bilgileri kaydedebilir. Dolayısıyla elasticsearch hem verinin ham halini hem de analiz edilmiş (anlamlı) hallerini kaydediyor.

REST mimarisi, Elasticsearch ile iletişim kurmanın temel yoludur. HTTP GET, POST, PUT, DELETE gibi HTTP istekleri kullanarak Elasticsearch ile etkileşimde bulunabilirsiniz. Bu, Elasticsearch ile Postman veya web tarayıcıları gibi araçlar aracılığıyla iletişim kurmanızı sağlar.

Sonuç olarak, Elasticsearch, farklı bir veri tabanı türüdür ve özellikle şema bağımsızlığı, yapısal ve yapısal olmayan veriler üzerinde güçlü sorgulama yetenekleri ve verileri analiz etme kabiliyeti gibi özellikleriyle diğer NoSQL veri tabanlarından ayıran birçok özelliğe sahiptir.

Elasticsearch Cores (Enterprice Search, Observability, Security)

Ücretli araçları, genellikle gelişmiş güvenlik, gözlem ve yönetim özellikleri sunar.

Elastic şirketi, ücretsiz bileşenlerin yanı sıra bazı ücretli bileşenler sunmaktadır. Bu ücretli bileşenler sayesinde, ek kod yazmadan veya özel işlemler yapmadan bir dizi özellikten faydalanabilirsiniz.

Elastic Enterprise Search: Diyelim ki ortak bir dosya havuzuna sahipsiniz, benzer Google Drive gibi. Bu havuzda Word, PDF, Excel vb. dosyalarınız bulunuyor ve bu dosyalar üzerinde kolayca arama yapmak istiyorsunuz. Elastic Enterprise Search, bu ihtiyacınızı karşılayabilir. Ayrıca mevcut web sitenizde binlerce belge bulunabilir ve bu belgeler üzerinde hiç kod yazmadan arama yapma yeteneği eklemek isterseniz, bu bileşeni kullanabilirsiniz.

Elastic Observability (Gözlem): Elastic şirketinin bir Elastic Cluster satın aldığınızda, bu bileşen, cluster içinde meydana gelen olayları otomatik olarak gözlemler. Ayrıca ölçeklendirme işlemlerini otomatik olarak gerçekleştirebilir ve gerektiğinde uyarılar tanımlayabilirsiniz. Gözlemle ilgili birçok özelliği hazır olarak sunar. Eğer Kubernetes gibi bir platform üzerinde kendi cluster’ınızı oluşturursanız, bu tür işlerin yönetimini kendiniz yapmanız gerekebilir. Ancak Elastic Observability bileşeni sayesinde, tek bir satır kod veya yapılandırma eklemek zahmetine katlanmadan bu işten kurtulabilirsiniz.

Elastic Security (Güvenlik): Elastic şirketinin sunmuş olduğu cluster veya veri tabanları güvenlikle ilgili olarak her iletişimi güvence altına almaktadır. Bu bileşen, bir dizi güvenlik özelliği içermektedir.

--

--