ElasticSearch Solr Karşılaştırması
Bu yazıda Solr gibi Lucene tabanlı bir full text search engine olan ElasticSearch‘ü genel hatlarıyla inceleyeceğiz. Ancak öncelikle popüler bir tartışma olan ElasticSearch mü Solr mı değinelim. Daha önce full text search engine araştırıp Solr’ı seçtiyseniz, konfigurasyon dosyasında boğulmuş, türkçe karakterlerde sıkıntı çekmiş olabilirsiniz. (v 3.6.2’ye kadar) ElasticSearch’de bunların hiçbirini yaşamayacağınızı belirterek öncelikle içinizi rahatlatayım.
İkisinin de kurulumu son derece basit. Servisi hazır, çalışır hale getirmek ikisinde de kolay. Solr’da elinize yüzünüze bulaştırma ihtimaliniz daha yüksek, özellikle java ortamına uzaksanız..
Servisi çalıştırdıktan sonra ElasticSearch de çalışmaya hemen başlayabilirsiniz. ElasticSearch schema-less olduğu için; index,type,field, field type gibi alanları önceden istemiyor. Bir kayıt eklerken, index’i x, type’ı y, field ve field değerleri şu olsun diye ekleyebiliyorsunuz. X index’i, y type’ı, field ve field type’ları o an oluşturuluyor sizin eklediğiniz kayıta göre. Tabii ki kayıt eklemeden önce veya ekledikten sonra bu tanımlamaları değiştirebiliyorsunuz.
Solr’da field ve field type’lar baştan belirtilmek zorundasınız. Yeni field eklemeye kalktığınızda bütün kayıtları tekrar Solr’a aktarmanız gerekiyor. Sharding ve Replication sayıları da Solr’da baştan veriliyor. Sonradan değiştirilemiyor.
ElasticSearch de bu değişiklikler en baştan değil, tarama başına değiştirilebiliyor. 1M log taradığımızı düşünelim, bu index veya type için default tanımlamaları değiştirelim. Yeni yaptığımız değişiklikler yeni gelen kayıtlar için geçerli olacaktır. Önceki 1M kayıt bu tanımlamalara dahil olmuyor.
Solr ve ElasticSearch kıyaslama da son olarak cluster yapısına değinelim. Standart ElasticSearch kurulumu yapılmış iki bilgisayar aynı ağda ve aynı cluster name’de olduğunda birbirlerini otomatik görüyorlar. Clustername’i ise config/elasticsearch.yml içindeki satırdan değiştirebilirsiniz. Başka hiçbirşey yapmanıza gerek yok. Solr da cluster yapısı hiç denemedim. Ancak gördüğüm kadarıyla 4.0’da manage edilebilir bir arayüz dahi geliyor. Yine de Solr’ın basit anlayışı ile ElasticSearch’ün basit anlayışı arasında fark olacağı kanaatindeyim. Solr cluster yapısı ile ilgili bilgisi olanlar yorum yazarlarsa faydalı olacaktır.
Genel bir sonuç ancak performans ve stabilite testleri sonucunda ortaya konabilir. Burada da siz hangisini iyi düşünüp tasarlarsanız o daha iyi olacaktır demek en doğrusu. Açıkçası ElasticSearch’ün daha iyi bir gelecek vaad ettiğini düşünüyorum. Sizden de gözlemlerinizi ve fikirlerinizi bekliyoruz.
ElasticSearch Kurulumu
– Öncelikle java kurulumunu yapmalıyız.
– ElasticSearch’ü kuracağımız dizine girelim. Ben /opt dizini altına kuracağım.
– Ardından wget ile ElasticSearch’ü indirelim ve sıkıştırılmış dosyayı açıp, daha kolay erişmek için link verelim.
# Java'yı Kuralım $ apt-get install openjdk-7-jre-headless # Çalışma dizinimize geçelim. Ben /opt dizinini kullanacağım. cd /opt # ElasticSearch'ü indirelim $ wget 'http://download.elasticsearch.org/elasticsearch/elasticsearch/elasticsearch-0.90.0.Beta1.tar.gz' # Sıkıştırılmış dosyayı açalım. $ tar zxvf elasticsearch-0.90.0.Beta1.tar.gz # Daha kolay erişmek için link verelim. $ ln -s elasticsearch-0.90.0.Beta1 elasticsearch
– ElasticSearch Service Wrapper’ı kuralım böylelikle servis olarak yönetilmesini sağlayalım.
# Service Wrapper'ı indirelim: $ wget 'https://github.com/elasticsearch/elasticsearch-servicewrapper/archive/master.zip' # İndirdiğimiz sıkıştırılmış dosyayı çıkartalım: $ unzip master.zip # Çıkan dosyanın içindeki 'service' klasörünü /opt/elasticsearch/bin/ altına atalım. $ mv *servicewrapper*/service elasticsearch/bin/ # Şimdi servisi yükleyelim $ /opt/elasticsearch/bin/service/elasticsearch install $ ln -s `readlink -f elasticsearch/bin/service/elasticsearch` /usr/bin/elasticsearch_ctl
– Kurulum bitti, ElasticSearch’ü çalıştıralım.
$ /usr/bin/elasticsearch start
– Konsolda aşağıdaki komutu çalıştırıp test edelim:
$ curl -XGET 'http://localhost:9200/_cluster/health?pretty=true'
Veya tarayıcınıza http://localhost:9200 yazıp aşağıdaki çıktıyı alıyorsanız işlem tamam demektir.
{ "ok" : true, "status" : 200, "name" : "Lighting Rod", "version" : { "number" : "0.90.0.Beta1", "snapshot_build" : false }, "tagline" : "You Know, for Search" }
ElasticSearch Kullanımı
Şimdi de ElasticSearch’de yapabileceğiniz temel işlemleri inceleyelim. Öncelikle ElasticSearch RESTful yani http istekleri ile çalışan bir ürün olduğu için kullanımı curl ile anlatacağız. Php, Python, Perl, Ruby, .NET vs birçok platform için client mevcut. Bu arada sık sorulan bir soruyu da yanıtlıyalım; Java için native client var. Kendilerinin önerdikleri client listesine buradan ulaşabilirsiniz.
ElasticSearch’de kayıt ekleme :
$ curl -XPUT 'http://localhost:9200/logger/log/1' -d '{ "user" : "hasanislamoglu", "ip" : "123.123.123", "authDate" : "2013-02-22T17:30:16" }'
Konsola yukarıdaki komutu verdiğiniz de kayıt ElasticSearch’e eklenmiş olacaktır. Şimdi komutu inceleyelim. Logger ne? Log ne? 1 ne?
Logger: Index log: Type 1: ID
Logger indexi veya log type yaratmanıza gerek yok. Siz böyle bir kayıt eklemeye çalıştığınızda ElasticSearch ne yapmaya çalıştığınızı anlayarak, standart ayarlarda bunları oluşturmaktadır.
Yukarıdaki örnek de ID vererek kayıt ekledik. ID vermeden de kayıt ekleyebilirsiniz. Ancak, auto generated id ile kayıt ekleyebilmek için muhakkak POST ile istek göndermeniz gerekmektedir. Aşağıda örneğini görebilirsiniz.
ElasticSearch’de ID vermeden, Auto Generated ID ile kayıt ekleme :
$ curl -XPOST 'http://localhost:9200/logger/log/' -d '{ "user" : "hasanislamoglu", "ip" : "123.123.123", "authDate" : "2013-02-22T17:30:16" }'
ElasticSearch Bulk API kullanarak toplu index:
ElasticSearch’e kayıt ekleme işlemleri genel olarak böyle. Birde bulk api var. Json formatında oluşturduğunuz dosyanızı ElasticSearch’e verip, bütün index işlemini onun halletmesini sağlayabilirsiniz.
Kendi sitesindeki örnek üzerinden gidelim. Öncelikle istekler isimli bir dosya yaratalım ve içeriği aşağıdaki gibi olsun.
{ "index" : { "_index" : "test", "_type" : "type1", "_id" : "1" } } { "field1" : "value1" }
Burada ilk index yazan alan işlemi belirtiyor. _index: test, _type : type1 değerleri index/type/ noktasına kayıt yapacağını belirtiyor. Kaydın, id’si 1, field1 alanının değeri value1 olarak belirtilmiş. Şimdi istekler dosyamızı ElasticSearch’e aşağıdaki gibi gönderiyoruz.
$ curl -s -XPOST 'http://localhost:9200/_bulk' --data-binary @istekler; echo
Gerisini sadece ona bırakın, işlemleri sizin adınıza halletsin.Bulk API ile ilgili ayrıntılı bilgi : http://www.elasticsearch.org/guide/reference/api/bulk.html
ElasticSearch’de sorgu ile kayıt silme örnekleri :
$ curl -XDELETE 'http://localhost:9200/logger/log/_query?q=*:*' $ curl -XDELETE 'http://localhost:9200/logger/log/_query?q=user:hasanislamoglu'
ElasticSearch’de bütün indeksi silmek :
$ curl -XDELETE 'http://localhost:9200/logger/'
ElasticSearch _stats komutu ile gözlem yapmak :
$ curl -XGET 'http://localhost:9200/logger/_stats?pretty=true'
Bu komut ile logger indexine ait ayrıntılı bilgi alabiliyoruz. pretty=true ile çıktıların düzenli gelmesini sağlayabilirsiniz. İsterseniz yazmayıp, karmaşık çıktıları okumaya çalışabilirsiniz.
ElasticSearch’de Optimizasyon
Eğer indeksleme yapmaya başladıysanız 1’e 3 boyutları görüp korkmaya başlamışsınızdır. 1 GB’lık dosya tarattığınızda 3 GB index boyutu olması korkutucu gelmiştir muhakak. Şimdi biraz bu konuyu inceleyelim.
ElasticSearch’de boyutun artmasında en büyük sebep _source alanıdır. Burada sizin verdiğiniz veri ham olarak tutulmaktadır. Bu alan, arama yaptıktan sonra kayıtların gösterilmesi gerekmiyorsa kaldırılabilir.
Örneğin, smtp auth logları tarattığınızı düşünelim. Siz bir kullanıcının o gün kaç kere auth olduğunu öğrenmek istiyorsanız, ElasticSearch’den tek isteğiniz bir count almak ise _source alanını kaldırabilirsiniz.
ElasticSearch’de _source field’ını kaldırarak data folder boyutunu azaltmak :
$ curl -XPUT 'http://localhost:9200/logger/log/_mapping?pretty=1' -d'{ "log" : { "_source" : {"enabled" : false} } }'
ElasticSearch’de data folder boyutunu azaltmak için _source field’ını sıkıştırmak (compression):
$ curl -XPUT 'http://localhost:9200/logger/log/_mapping' -d '{ "log" : { "_source" : { "compress" : true } } }'
ElasticSearch v0.90.0.Beta1 ile _source alanı için default compression; true olarak gelmektedir. Yani ElasticSearch yeni versiyonu ile _source alanını otomatik olarak sıkıştırmaktadır.
ElasticSearch’de optimizasyon yapmak için:
$ curl -XPOST 'http://localhost:9200/logger/_optimize'
ElasticSearch’de full optimizasyon yapmak için :
$ curl -XPOST 'http://localhost:9200/logger/_optimize?max_num_segments=1'
Sorularınız için istediğiniz zaman ulaşabilirsiniz..
Hadoop Kitap Önerileri Pig ve Hive ile Hadoop Üzerinde Veri Analizi
Hasan’a yazısı için çok teşekkür ederim. Başka yazılarını da bekliyoruz.
“ElasticSearch’de boyutun artmasında en büyük sebep _source alanıdır.” demişsiniz, burdaki boyuttan kastınız (önceki cümlenize bakarak söylüyorum) sanırım index boyutu ancak _source alanı indexlenmediğini için o alana dahil değil ve filter query’de cache özelliği aktif edilmedikçe memory’ye de yüklenmiyor.
Index boyutunu düşürmek için eğer bütün alanlarda genel bir arama yapılmıyorsa genellikle _all alanı devre dışı bırakılıyor.
Merhabalar;
elasticsearch/data klasörünün boyutundan bahsediyorum. Harddisk üzerinde kapladığı yeri azaltmak için _source compression öneriyorum ki yeni sürümde artık varsayılan olarak compression:true geliyor.
Çok güzel bir yazı olmuş, elasticsearch hakkında merak ediyordum, armut piş ağzıma düş oldu.
Sadece Solr ve ES için değil, başka herhangi bir yazılımı yada framework’ü tercih etmede bir kaç başlığın önemli olduğunu düşünüyorum. Bana kalsa farklı amaçlar için yeri geldiğinde farklı araçları kullanmak gerekebiliyor. Bir programlama diline, bir yazılıma fanatik bir tutkuyla bağlanmamak lazım. Bir bakıma, süreç aracı belirler de diyebiliriz.
Bu girişten sonra Solr ve ES’yi bir kaç başlıkta daha değerlendirebilirseniz çok sevinirim.
Performans: ne kadar zamanda, ne kadar işlem / işlev gerçekleştirilebiliyor?
Kullanışlılık: Yüklemesi, çalıştırması, kullanmasının kolay olması
Olgunluk: Yani yazılımların ne kadar süredir kullanılıyor olduğu ve ne kadar geliştirilmiş olduğu
Topluluk: Bu belki de benim gibi bir çok kişinin tercihini belirleyen en önemli etmendir. Uygulamayı kullanan ve sorunlara çözüm üreten bir topluluğu var mı? Wikisi sürekli olarak güncelleniyor mu? Sorduğum sorulara yanıt bulabiliyor muyum?
Boyutlandırılabilme: farklı dillerde geliştirmeye, elsatikiyete uygun mu? Java ile yazılmış olsa da Python desteği var mı? Açık kaynak ama sadece şirket mi güncelliyor yoksa başkaları tarafından da eklentiler üretiliyor mu?
GUI: arayüzü kullanışlı mı? Kullanıcı deneyimi göz önünde bulundurularak mı tasarlanmış? Zaman içinde kullanıcı istekleri ve beklentileri göz önünde bulundurularak geliştirilmiş mi?
Dökümantasyon: Topluluk olduğunda bu kısma nispeten daha az ihtiyaç duyuyoruz ama, yardım dökümanlarının ihtiyaçları karşılayacak kadar çeşitli ve detaylı olması da tercih için önemli bir etken.
Bu sorulara, kullanılacak proje göz önünde bulundurularak verilecek yanıtlar daha doğru bir tercih yapılmasını sağlayacaktır. Ben kendime göre bir önem sırası ile yazdım. Her projede bu önem sırası değişkenlik gösterecektir.
İyi seneler
Merhaba,
Yukarıdaki komutları nereye yazıp çalıştırıyorsunuz? Ben sadece elasticsearch kısmını çalıştırdım.
{
“ok” : true,
“status” : 200,
“name” : “Lighting Rod”,
“version” : {
“number” : “0.90.0.Beta1”,
“snapshot_build” : false
},
“tagline” : “You Know, for Search”
}
buraya kadar geldim ama gerisini anlamadım? Elasticsearch kullanımı kayıt ekleme vs gibi kodları nereye yazıp çalıştırıyorsunuz?
Selam,
Ya Linux komut satırından CURL ile ya da Postman gibi pluginler ile ilgili HTTP isteklerini yaparak ES kullanabilirsiniz.