Elasticsearch’e Giriş

Sinan Oral
ÇSTech
Published in
3 min readDec 28, 2022
You know, for search

Herkese merhaba. Ben Sinan, Çiçeksepeti teknoloji departmanında listeleme ekibinde backend developer olarak çalışıyorum. Bu yazıda Elasticsearch’ten ve terminolojisinden bahsettikten sonra Docker üzerinde kurulumunu yapıp indexleme ve search işlemleri yapacağız.

Elasticsearch Nedir ?

Elasticsearch, Apache Lucene tabanlı bir metin (full text) arama motoru ve analiz aracıdır. Temel arama motoru olarak Lucene’i kullanır ancak Lucene’nin sunmadığı birçok özellik sunar. Örneğin, Elasticsearch’ün kullanımı kapsamlı bir REST API’sine dayanır. Elasticsearch Java programlama dili ile yazılmış olup, ölçeklenebilir, distributed, cross-platform ve açık kaynaktır. (source code)

Elasticsearch Temel Kavramları Nelerdir?

  • Cluster: Bir veya daha fazla sunucunun (node) bir arada bulunduğu kümedir.
  • Node: Aranabilir veriyi depolayan ve bir kümenin parçası olan tek bir sunucudur.
  • Index: İçerisinde benzer dökümanları barındıran bir koleksiyondur. İlişkisel veritabanlarındaki database kavramı gibi düşünebilirsiniz.
  • Type: Benzer dökümanların bir sınıfını veya kategorisini temsil eder. Bir index bir veya daha fazla type’a sahip olabilir ve her bir type’ın da kendi mapping’i olabilir. İlişkisel veritabanlarındaki tablolar olarak düşünebilirsiniz.
  • Document: Elasticsearch tarafından indexlenen yapılardır. Anahtar-değer şeklinde ifade edilen field’lardan oluşur. Type yapılarında yer alan satırları temsil eder ve Type’lar bu yapılardan oluşur. JSON formatında temsil edilir. İlişkisel veritabanlarındaki tablolarda bulunan satırlar olarak da düşünebilirsiniz.
  • Mapping: İndekslenen verilerin hangi veri tipinde olduğunun tanımlandığı işlemdir. İlişkisel veritabanlarındaki şemalar olarak düşünebilirsiniz.

Docker İle Kurulum 🐳

Yazının başlarında Elasticsearch’ün Rest API ile kullanıldığından bahsetmiştik. Bunun için Curl, Postman gibi bir HTTP istemcisine ihtiyacımız var. Fakat biz, sunduğu auto-complete gibi özelliklerinden dolayı Elastic Stack’ten olan Kibana ile devam edeceğiz. Tabi Kibana’nın yetenekleri auto-complete ile sınırlı değil detaylarını buradan inceleyebilirsiniz. Şimdi Docker compse ile Elasticsearch ve Kibana’yı ayağa kaldırmak için gerekli hazırlıklarımızı yapalım. (Docker’ın localinizde kurulu olduğunu varsayarak)

Burada single-node ile cluster’ımızın tek bir node’dan oluşacağını belirtiyoruz. security.enabled özelliğini kapatarak herhangi bir authentication olmadan doğrudan elasticsearch’e bağlanmayı sağlayacağız. iki container’ın birbirleriyle iletişim kurmasını sağlamak için de bir iç ağ (es-net ağı olarak adlandırdığım) köprüsü oluşturmamız gerekiyor. Portlarını yerel makinemize açsalar da container’lar bu portlar aracılığıyla iletişim kurmazlar.

Artık yukarıdaki docker-compose.yml dosyamızın bulunduğu dizinde docker compose up -d komutunu çalıştırarak Elasticsearch ve Kibana’yı ayağa kaldırabiliriz. http://localhost:9200/ adresine gidip o meşhur “You Know, for Search” tagline’ını görüyorsak kurulum başarıyla sonuçlanmıştır demektir 🎉🎉

İndexleme ve search işlemlerine geçebililiriz.

Öncelikle Kibana için http://localhost:5601/ adresine gidiyoruz ve sol üst taraftaki menü altından sorgularımızı yazacağımız Dev Tools > Console’a giriyoruz.

İndex Oluşturma

PUT /movies

Index’imizi oluşturmak için yukarıdaki sorguyu çalıştırıyoruz. Herhangi bir mapping eklemiyoruz. İlk dökümanımızı eklediğimizde Elasticsearch bizim için otomatikman mapping’i oluşturacak. Hiç index oluşturmadan aşağıdaki sorguyu çalıştırsaydık da bizim için index oluşturacaktı.

Döküman Ekleme

POST /movies/_doc
{
"title": "Warm Bodies",
"director": "Jonathan Levine",
"year": 2013,
"stars": ["Nicholas Houlth", "Teresa Palmer", "John Malkovich"]
}

İlk dökümanımızı eklemek için yukarıdaki sorguyu çalıştırıyoruz. Her dökümanın bir Id’si olmalı eğer biz belirtmezsek Elasticsearch bizim için random oluşturacak. Belirtmek istiyorsak aşağıdaki sorguyu çalıştırabiliriz.

POST /movies/_doc/1
{
"title": "Warm Bodies",
"director": "Jonathan Levine",
"year": 2013,
"stars": ["Nicholas Houlth", "Teresa Palmer", "John Malkovich"]
}

Döküman Okuma

GET movies/_search

Index’teki tüm dökümanları getirmek için yukarıdaki sorguyu çalıştırabiliriz. Eğer belirli bir id ile getirmek istiyorsak da aşağıdaki sorguyu çalıştırabiliriz.

GET movies/_doc/1

Döküman Silme

DELETE movies/_doc/1

Belirli bir id’li dökümanı silmek için yukarıdaki sorguyu çalıştırabiliriz. Eğer olmayan bir id’li dökümanı silmeye çalışırsak 404 hatası alırız.

Döküman Güncelleme

POST /movies/_doc/1
{
"hello": "world"
}

Eğer dökümanımızı tamamen güncellemek istiyorsak yukarıdaki sorguyu çalıştırabiliriz. Sadece belirli bir alanı güncellemek veya yeni alan eklemek istiyorsak ise aşağıdaki sorguyu çalıştırabiliriz.

POST /movies/_update/1
{
"doc": {
"genres": ["Romance", "Horror"]
}
}

Döküman Arama

GET /movies/_search
{
"query": {
"match": {
"title": "warm"
}
}
}

Son olarak döküman aramak için ise yukarıdaki sorguyu çalıştırabiliriz. Title’ında warm geçen dökümanları getirecektir.

Bu yazımda Elasticsearch’e giriş yapmış olduk. Umarım faydalı olmuştur. Sonraki yazılarda görüşmek üzere…

Kaynakça

--

--