obenplus.com | oben+ | Hikayesi bol bir yazılımcının kaleminden, teknoloji dünyasını en önemli ve en ince ayrıntısına kadar takip etmek, bir yazılımcının hayatını, yaşantısını gözlemlemek isteneyenler için...

All posts tagged marvel

Blogumdaki yazılar, hiç bir maddi amaç güdülmeden, tamamen Türk yazılımcılarına, Türkçe kaynak olabilmesi için hazırlanmış yazılardır. Bu nedenle, yazıya verilen emeğin bir sonucu olarak, yazıyı benimle iletişime geçip iznimi almadan paylaşmamanızı rica ederim. Yazılarımın paylaşılması durumunda doğacak olan yasal haklarımı kullanabileceğimi belirtmek isterim.

Yazı içerisindeki kodlar ve örnekler, kısıtlı zaman içerisinde hazırlandığı için, bir takım hatalar içerebilmektedir. Bu konuda beni mail ya da telefon yolu ile bilgilendirebilirseniz, sevinirim.

Bu yazı içerisinde REST API kullanımı çok fazla bulunmaktadır. Bu nedenle yazıya başlamadan önce REST API konseptini bildiğinizden emin olunuz. Emin değilseniz lütfen buradaki ve buradaki yazılarımı okuyarak konuya hazırlanınız.

Elasticsearch’ü bilgisayarınıza nasıl kuracağınıza ve Elasticsearch Marvel, Sense hakkında detaylı bilgiye bu yazımdan ulaşabilirsiniz.

Amaç

ElasticSearch (Aslında ElasticSearch eski adı, artık Elastic olarak anılıyor fakat bende alışkanlık oldu, ElasticSearch olarak yazacağım), büyük ölçekli, açık kaynak kodlu bir arama motorudur. Apache Lucene üzerine kurulmuş bir yapısı vardır ve kulağa en hoş gelen özelliği sunduğu REST API sayesinde, kolaylıkla kullanılabilir olmasıdır. Bu tutorialde sizlere Elasticsearch’ün anahtar konseptlerinden bahsetmeye çalışacağım.

Sense ile Elasticsearch REST API Kullanımı

Elastic’i indirip, bir instanceına sahip olduğunuz andan itibaren, artık sizinle REST API üzerinden JSON bazlı olarak localhost’un 9200 portundan konuşan bir Elasticsearch cluster’ına sahip olmuş oluyorsunuz. Bu durumun doğal sonucu olarak, herhangi bir HTTP Client’ı kullanarak, Elastic ile konuşabilir hale geliyorsunuz. Elasticsearch’ün kendi dökümantasyonunda genelde Sense ya da CURL komutları ile örneklemeler yapılmıştır. Herneyse, eğer siz Sense ya da CURL kullanmaya istekli değilseniz, herhangi bir grafiksel HTTP client uygulamasını bilgisayarınıza indirerek kurabilirsiniz.

Daha proaktif olsun farklı bir çözüm ama kullanışlı bir çözüm arıyorum diyorsanız, size Google Chrome’un bir extensionu olan Sense pluginini önerebilirim. Plugini buradan ekleyebilirsiniz. Sense plugin sayesinde Elastic’in REST API’sine basit ve prettify edilmiş bir UI üzerinden ulaşmanız mümkün. Burada ayrıca pluginin bir özelliği olarak Autocomplete ile Elastic’in query syntaxına kolaylıkça adapte olabilirsiniz. Bir request’i run etmeniz için CTRL+Enter demeniz yeterli.

Bu tutorial boyunca, sizlere Marvel -> Sense üzerinden Curl requestleri kullanarak elastic üzerinde işlem yapma konusunda bilgi aktarımı sağlayacağım. Bu nedenle sizlere önceki yazımda anlattığım Marvel plugin’ini kurmayı şiddetle tavsiye ediyorum.

Screen Shot 2015-07-21 at 22.33.40

CRUD

İlk aşama olarak her ne kadar Elastic’i arama işlemleri için kullanmayı istesek de, ilk aşamada yapmamız gereken, bir index populate etmek ve içerisine data yerleştirmek. Elastic açısından aslında CRUD işlemi bir indexleme işlemidir ve ilk öğrenmemiz gereken şey, update, read, delete ve create işlemlerinin nasıl olduğudur.

Indexleme İşlemi Ne Demektir ?

Elasticsearch için indexleme işlemi, CRUD metninin içerisinde geçen iki harfin yani “Create” ve “Update” in karşılığıdır. Eğer bir dökümanı bir type ve document id ile indexlersek, aslında eğer böyle bir döküman yoksa ekleme yapılır, ya da aynı tip ve document id içeren bir kayıt varsa bu durumda da overwrite işlemi yapılır yani mevcut silinir, üzerine yazma işlemi yapılır.

Dilerseniz hep birlikte, ilk indexleme işlemimizi yapalım. HTTP açısından bir JSON objemizi Elastic Engine’e göndermek için POST ya da PUT request göndermemiz gerekmektedir. Eğer dökümanın ID değerini biliyorsak, bu durumda PUT, bilmiyorsak POST kullanmamız gerekiyor.

Gelin index, type, document id terimleri iyice kafamızı karıştırmadan önce bir bu terimlere değinelim.

Index

An index is like a database in a relational database. It has a mapping which defines multiple types. An index is a logical namespace which maps to one or more primary shards and can have zero or more replica shards.

Index, relational bir veritabandaki veritabanına benzer anlam taşır. İçerisinde çok sayıda type barındırabilir. Bir index aslında, bir ya da daha fazla shard’ın mantıksal namespace’i anlamına gelmektedir. Elasticsearch’e bir indexleme işlemi yapılırken, ilgili index henüz yaratılmamış ise, Elastic kendisi bu indexi otomatik olarak yaratır.

Type

A type is like a table in a relational database. Each type has a list of fields that can be specified for documents of that type. The mapping defines how each field in the document is analyzed.

Type aslında, ilişkisel bir veritabanındaki tablolara benzemektedir. Her bir type içerisinde field listesi barındırır ve ilgili type’a özeldir. Elasticsearch indexleme sürecindeki mapping süreci aslında, type içerisindeki field’lerin nasıl analiz edildiği ile ilgilidir.

Document

A document is a JSON document which is stored in elasticsearch. It is like a row in a table in a relational database. Each document is stored in an index and has a type and an id. A document is a JSON object (also known in other languages as a hash / hashmap / associative array) which contains zero or more fields, or key-value pairs. The original JSON document that is indexed will be stored in the _source field, which is returned by default when getting or searching for a document.

Document aslında bir JSON metninin Elastic’de tutulan haline deniyor. Nasıl index database i , type o database in içerisindeki bir tabloyu ve field o tablonun sütunlarını ifade ediyorsa, document’de tablodaki bir satırı ifade ediyor. Her bir döküman aslında index + type + id den oluşan bir bilgi anlamına geliyor. Elastic ile aklınıza gelen tüm JSON metinlerini indexlemeniz mümkündür.

Field

A document contains a list of fields, or key-value pairs. The value can be a simple (scalar) value (eg a string, integer, date), or a nested structure like an array or an object. A field is similar to a column in a table in a relational database. The mapping for each field has a field type (not to be confused with document type) which indicates the type of data that can be stored in that field, eg integer, string, object. The mapping also allows you to define (amongst other things) how the value for a field should be analyzed.

Bir döküman, aslında bir tablodaki bir satırı ifade eder dediğimize göre, bu tablodaki sütunları ifade eden döküman, aslında field listesinden meydana gelmektedir. Herhangi bir field’a gelen değer, bir simple data da olabilir (integer, long, date, string vb. ) , kompleks bir tip de olabilir (array ya da obje vb.). Yani field, bir tablodaki sütunlar anlamına gelmektedir. Field’lar map edilirken, her bir field’in tipi, Elastic tarafından otomatik olarak algılanır.

İlk Index

Terimlerin anlamlarını da kavradığımıza göre, pratik kazanmak için ilk request’imizi gönderelim.

Bu request içerisinde library -> index , books -> type ve 1 -> document id anlamına gelmektedir. İlgili dökümanın fieldları, title, name.first, name.last, publish_date ve price ‘dır.

Bu çağrıyı Elastic’e yaptığımız anda aşağıdaki yanıtı alırız;

Read more


Blogumdaki yazılar, hiç bir maddi amaç güdülmeden, tamamen Türk yazılımcılarına, Türkçe kaynak olabilmesi için hazırlanmış yazılardır. Bu nedenle, yazıya verilen emeğin bir sonucu olarak, yazıyı benimle iletişime geçip iznimi almadan paylaşmamanızı rica ederim. Yazılarımın paylaşılması durumunda doğacak olan yasal haklarımı kullanabileceğimi belirtmek isterim.
Yazı içerisindeki kodlar ve örnekler, kısıtlı zaman içerisinde hazırlandığı için, bir takım hatalar içerebilmektedir. Bu konuda beni mail ya da telefon yolu ile bilgilendirebilirseniz, sevinirim.
Bu yazı “Elasticsearch Nedir?” yazısı değildir. Yazı içerisinde bir nebze Elasticsearch’ün ne olduğuna değinilmektedir fakat, temelde amaç teknik olarak kullanımını gösterebilmektir.

ElasticSearch Nedir ? (Son Derece Özet Anlamıyla)

Elasticsearch, web sitesinde aşağıdaki şekilde tanımlanmaktadır;

Elasticsearch is a highly scalable open-source full-text search and analytics engine. It allows you to store, search, and analyze big volumes of data quickly and in near real time. It is generally used as the underlying engine/technology that powers applications that have complex search features and requirements.

Yani, 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. Elasticsearch, data store etme, arama yapma, analiz etme gibi konularda yardımcı olur. Günümüzde bigdata kavramının da artık herkesin dilinde olduğunu göz önünde bulunduracak olursak, büyük ölçekli dataları, hızlı ve gerçek zamana yakın (near real time) bir şekilde arama ve analiz etme olanağını bizlere sunmaktadır Elasticsearch.

Kurmak Zor Mudur?

Elasticsearch nasıl kurulur diye bir başlık açmadan önce, çoğu arkadaşımda gördüğüm, kurulumu zor sanki bunun önyargısından bahsetmek istiyorum. Bir arkadaşımın (ismini vermek istemiyorum 🙂 ) benimle yaptığı konuşma aynen şöyle;

– X : Hocam elasticsearch diye birşey varmış duydun mu ? – Oben : Evet hacım, merak ettim biraz inceledim, bigdata olayında bayağı faydalı oluyormuş eheheh. – X : Valla öyle diyorlar, acep nası bişe ben de bir ara inceliyim ya. – Oben : Usta, Apache Lucene diye bir zımbırtı varmış, onun üzerine kurmuşlar adamlar, rest api falan yapmışlar, Lucene kompleks birşeymiş ama elasticsearch de bir çok şeyi çok basit bir şekilde yapabiliyormuşsun. Adamlar jar ları da veriyorlar, java üzerinden kolayca client kısmını da yazabiliyorsun. – X : Oğlum öyle anlatınca kolay da, kesin vardır bunda da bir b..kluk. O kadar kolay olsa adamlar o kadar getting started videoları falan niye hazırlasınlar?

Üç aşağı beş yukarı çoğumuzda, bir ön çekince oluyor ama aslında hiç korkmayın, çünkü gerçekten basit 🙂

İçimi Rahatlattın Oben, Nasıl Kuracağız Peki ?

1-Kurulum’a Hazırlık Aşaması

Ben Mac OSX kullandığım için Mac üzerinden anlatacağım, fakat windows için durum çok da farklı değil. Kişisel tavsiyem, windows bilgisayar kullanıyorsanız, linux kurun, biraz eliniz unix komutlarına alışsın, her zaman ihtiyaç duyacaksınız. Neyse, elasticsearch kurulumu için ilk yapmamız gereken buraya tıklayıp, en son versiyona ait tar.gz arşivini indirmek.

Daha sonra bu arşivi bilgisayarımızda bir yere export ediyoruz. Örneğin ben şuraya export ettim;

Bir bestpractice olarak Mac kullanıcıları için öneri eklemek istiyorum. “The missing package manager for Mac” başlığıyla yola çıkılıp hazırlanan brew pluginini indirmekte fayda var.  Kurulumu ise oldukça basit. Aşağıdaki komutu terminal pencerenize copy paste ediyorsunuz ve kurulum yapılıyor.

Benim brew ile gelen en çok kullandığım komut ise tree komutu. brew ile tree komutunu kurmak için aşağıdaki komutu yine terminal pencerenizde çalıştırmanız yeterli;

Bu sayede treeview olarak bir dosyanın içeriğini görmemiz mümkün. Örneğin elasticsearch’i export ettiğimiz yeri görmek için aşağıdaki komutu çalıştırmamız yeterli;

Screen Shot 2015-07-19 at 20.00.37Burada sol tarafta gördüğünüz üzere aslında elasticsearch az sayıda klasör ve az sayıda jar dosyasından oluşan bir yapıya sahip.

– bin klasörü aslında çeşitli işletim sistemleri için bir startup altyapısını sunuyor.

config klasöründe elasticsearch ü ve elasticsearch’ün sistem loglarını konfigüre etmek için 2 adet yml tipli dosya bulunuyor.

Burada ufak bir satır arası açalım yml üzerine. YML formatı bana çok gereksiz gelse de, işlevi, sadece belirli programlar tarafından erişilebilen dosyalar olarak özetlenebilir. Yani YML formatı yet another user markup language adıyla anılmasından da anlaşılabileceği üzere, java sever arkadaşlarımızın .properties olarak bildiği dosya içeriğine birebir benzeyen bir içeriğe sahip ama tüm uygulamaların açamadğı bir dosya formatıdır özetle.

data klasörü, elasticsearch ün tüm datasının tutulduğu klasör.

lib klasörü, elasticsearch tarafından kullanılan tüm jarlar.

logs klasörü, elasticsearch tarafından atılan sistem logları. Daha önce de belirttiğim gibi, config klasöründeki logging.yml dosyası üzerinden loglamayla ilgili değişiklikleri yapabiliyorsunuz.

plugins klasörü, elasticsearch e eklenen pluginlerin içeriklerinin tutulduğu klasördür.

Buraya kadar elasticsearch’ü indirdik ve export ettik. Kurulum bitti mi diye soracak olsaydınız, cevabım, bir kaç adım sonra bitiyor olacaktı. Gerçekten, neredeyse kurulumu tamamlamak üzereyiz 🙂

2-Sık Kullanılan Terimler

Kurulum’un konfigurasyon aşamasına geçmeden önce, elasticsearch de sıklıkla kullanacağımız terimlerden (Kurulum aşamasında sık sık adı geçenlerden) de özetle bahsetmek istiyorum;

Shard
A shard is a single Lucene instance. It is a low-level “worker” unit which is managed automatically by elasticsearch. An index is a logical namespace which points to primary and replica shards. Other than defining the number of primary and replica shards that an index should have, you never need to refer to shards directly. Instead, your code should deal only with an index. Elasticsearch distributes shards amongst all nodes in the cluster, and can move shards automatically from one node to another in the case of node failure, or the addition of new nodes.

Bir shard, Apache Lucene tarafından yaratılan bir instance anlamına gelmektedir. Elasticsearch tarafından otomatik olarak yönetilen, en alt düzey işlem birimine shard diyoruz. Elasticsearch, primary ve replica shard yönetimini, kendisi halledebilmektedir, bunun avantajı olarak, bizlerin, kaç primary ve kaç replika shard ihtiyacımız olduğunu (Normalde sanırım maksimum 6 primary ve 2 replica olabiliyor) ve bu shard ların yönetimiyle uğraşmamıza gerek yok. Bizi tek ilgilendiren şey, kaydımızın unique bilgisi olan indexlerimiz. Elasticsearch, shardları, cluster içerisindeki node lara otomatik olarak dağıtabilmekte, shardların yerlerini değiştirebilmektedir. Örneğin bir node üzerinde yaşanan bir failure durumunda elasticsearch, shardları otomatik olarak kaydırabilmektedir. Primary ve Replica Shard terimleri de aşağıdaki şekilde özetlenmiş; Read more