5

ElasticSearch

ElasticSearch Java ile geliştirilmiş açık kaynak, lucene tabanlı, ölçeklenebilir bir tam metin(full text) arama motoru ve veri analiz aracıdır.

Günümüz bilişim dünyasında, sosyal medyada, video paylaşım sitelerinde, iletişim, sağlık, güvenlik ve diğer alanlarda hizmet veren orta ve büyük ölçekli şirketlerde her an devasa ölçekte veri üretiliyor. Burada bir bilgi/veri okyanusundan bahsediyoruz ve bilişim dünyasında bu okyanusa kısaca big data diyoruz. Big data dünyasında bahsettiğimiz bu verilerin önemli bir bölümü başlangıçta, yapılandırılmamış(unstructured) dağınık ve tek başına çok da anlamlı olmayan haldedirler.

Bu sebeple bu devasa verinin performanslı olarak kayıt altına alınması, erişilmesi, analiz edilip işlenmesi gibi ihtiyaçlar söz konusudur. ElasticSearch, benzeri arama motorları gibi, big data dünyasına has bahsedilen problemlerle başa çıkmak adına geliştirilmiş araçlardan birisidir.

Güçlü ve esnektir. Gerçek zamanlı(real-time) ve dağıtık(distributed) oluşu en önemli artılarındandır. ElasticSearch bugün Mozilla, Foursquare, GitHub gibi projelerde içerik aramaları, veri analizi ve sorgulamalarda kullanılmaktadır.

ElasticSearch’ü keşfetmek için önce, bazı temel özellik ve kavramlarına yakından bakacağız.

logo

Tam metin arama

Veritabanlarında depolanan veri büyüdükçe, bu veri üzerinde gerçekleştirilen sorgu operasyonlarında hız/performans sorunları meydana gelmektedir. Buna çare olarak, metin alanlarında yer alan kelimelerin endekslenerek kataloglanması yoluna gidilmiştir. Bu sayede büyük boyutlu veri ile çalışılırken dahi, veritabanlarının daha hızlı, performanslı cevap vermesi sağlanmıştır.

ElasticSearch çoklu dil desteği, güçlü bir sorgu dili ve otomatik tamamlama gibi güçlü tam metin arama yetenekleri sağlar.

 

Index

ElasticSearch belge yönelimli(document oriented) bir arama motorudur. ElasticSearch’te her kayıt, yapılandırılmış JSON belgesidir. Bir başka deyiş ile, ElasticSearch’e endekslenmesi için gönderilmiş her veri bir JSON dokümandır. Dokümanın bütün alanları varsayılan olarak endekslenir ve tek bir sorguda kullanılabilir.

Veritabanı yönetim sistemlerine kıyasla ElasticSearch endeksleri, veritabanları gibi düşünülebilir. Nasıl ki bir veritabanı, düzenli bilgiler topluluğudur, ElasticSearch endeksleri de yapılandırılmış JSON belgeler topluluğudur.

 

Type

Tipleri, yine veritabanı yönetim sistemlerine kıyasla tablolar gibi düşünebiliriz. Endeksler, bir ve birden fazla tip içerebilir.

 

Mapping

Haritalama, bir belgenin arama motoruna nasıl aktarılması gerektiğini tanımlama sürecidir. Tipler oluşturulurken, mapping bilgisi ile oluşturulur. ElasticSearch, gönderilen veriden hareketle(örneğin string, integer, double, boolean) mapping’i otomatik oluşturur(açık haritalama/explicit mapping). Bir mapping tanımlayarak varsayılan mapping’i geçersiz kılabilirsiniz.

 

RESTfull Api

ElasticSearch, RESTfull Api’ye yöneliktir. Hemen hemen her eylem RESTfull API ile, HTTP üzerinden JSON kullanarak gerçekleştirilebilir.

 

Nasıl Kurulur?

Kurulum, son ElasticSearch dağıtımını indirip, unzip işlemi sonrası işletim sisteminize uygun çalıştırılabilir dosyayı çalıştırmaktan ibarettir.

Unix sistemler için:


bin/elasticsearch -f

Windows için:


bin/elasticsearch.bat

Terminalden


curl -X GET http://localhost:9200/

ile ya da browser’dan yapılacak http://localhost:9200/ isteği bize, aşağıdaki gibi bir çıktı veriyorsa, servis beklendiği gibi çalışıyor ve ElasticSearch ile çalışmaya hazırız demektir.


hakdogan:elasticsearch hakdogan$ curl -X GET http://localhost:9200/
{
  "ok" : true,
  "status" : 200,
  "name" : "Venom",
  "version" : {
    "number" : "0.90.2",
    "snapshot_build" : false,
    "lucene_version" : "4.3.1"
  },
  "tagline" : "You Know, for Search"
}

 

Elastik

ElasticSearch şema bağımsız(schema free) olduğu için index, type, field type gibi tanımları endeksleme işlemi öncesi talep etmiyor. Bir kayıt eklendiğinde ElasticSearch, veri yapısını ve endeksini tespit etmeye çalışıyor ve aranabilir hale getiriyor. İstenirse, kayıt ekleme öncesi ya da sonrasında index, type, field ve field type tanımları değiştirilebiliniyor.

Burada ElasticSearch’ün sağladığı esnekliği kavramak önemlidir. Aynı endekste farklı tip, isim ve sayıda alana sahip doküman barındırabilmek kuşkusuz önemli bir artı değer. Örneğin, bir başka popüler tam metin arama motoru olan Solr’da field ve field type’ları önceden tanımlamak zorunludur. Yeni bir field eklemek istendiğinde ise, var olan bütün kayıtları tekrar Solr’a aktarmak gerekiyor. ElasticSearch’ün bu kısıtlamalara sahip olmamasını, NoSQL mimarilerin sağladığı tablo ve sütun bağımsızlığına benzetebiliriz.

Bahsedilen esnekliği, ElasticSearch’e ilk kaydımızı ekleyerek deneyimleyelim. ElasticSearch’ün RESTfull Api’ye yönelik olduğundan yukarıda söz etmiştim. Bu sebeple kayıt ekleme işlemini curl(client url library) kullanarak gerçekleştireceğiz.


hakdogan:~ hakdogan$ curl -XPUT localhost:9200/kodcucom/article/1 -d '
> {
> title: "ElasticSearch",
> content: "ElasticSearch is developed in Java, open source, lucene-based, scalable full-text search engine and data analysis tool.",
> date: "2013-08-05T12:00:00",
> author: "Hüseyin Akdoğan"
> }'
{"ok":true,"_index":"kodcucom","_type":"article","_id":"1","_version":1}

Yukarıdaki komutla, ElasticSearch’e ilk kaydımızı eklemiş olduk. Şimdi aşağıdaki komutu çalıştırıp, girdiğimiz kaydı talep edip, üretilen çıktıya bakalım.


hakdogan:~ hakdogan$ curl -XGET localhost:9200/kodcucom/article/1?pretty=true
{
  "_index" : "kodcucom",
  "_type" : "article",
  "_id" : "1",
  "_version" : 1,
  "exists" : true, "_source" : 
{
title: "ElasticSearch",
content: "ElasticSearch is developed in Java, open source, lucene-based, scalable full-text search engine and data analysis tool.",
date: "2013-08-05T12:00:00",
author: "Hüseyin Akdoğan"
}
}

Görüldüğü gibi, kayıt öncesi kodcucom adında bir endeks, article adında bir tip oluşturmadığımız halde ElasticSearch, girdiğimiz kayıttan hareketle bunları standart ayarlarla oluşturdu.

Id değeri 1 olan kaydın(JSON belgesi) tipi article, endeksi kodcucom.

 

Küme

Elasticsearch, yatay ölçekli inşa edilmiştir. Daha fazla kapasiteye gereksinim duyulduğunda düğüm sayısını artırmak yeterlidir. Bu durumda küme, ekstra donanımdan yararlanmak için kendini reorganize edecektir.

Aynı ağda, cluster name’i aynı x sayıda standart ElasticSearch kurulumu, birbirini otomatik bulur ve bağlanır. ElasticSearch yapılandırma dosyaları, ElasticSearchAnaDizini/config klasörü altında bulunur. Cluster name için bu klasörde bulunan elasticsearch.yml dosyasında ilgili satırın düzenlenmesi gerekir.


################################### Cluster ###################################
# Cluster name identifies your cluster for auto-discovery. If you're running
# multiple clusters on the same network, make sure you're using unique names.
#
# cluster.name: elasticsearch

 

İstemci desteği

Java, Php, Python, Perl, Ruby, .NET gibi birçok platform için client desteği mevcuttur. Tam listeye bakmak için: Clients

 

Sonuç

ElasticSearch, benzerlerine kıyasla gerek konfigürasyon gerek kullanım açısından oldukça elastik, büyük veri ile çalışan sistemlerde I/O darboğazlarına sebebiyet verebilen arama işlemleri ve veri analizi için son derece cazip bir seçenektir.

Gelecek makalelerde ElasticSearch ile temel CRUD operasyonlarını, sağlanan Java API ve bu yararlı aracın bir web projesinde kullanımı gibi konuları ele almayı umut ediyorum.

Hüseyin Akdogan

5 Comments

  1. Açık ve anlaşılır bir anlatım olmuş, emeğinize sağlık teşekkürler.

Bir Cevap Yazın