İlişkisel veritabanları (RDBMS), indexlenmiş veriler dışındaki aramalarda oldukça yavaş bir arama performansı sağlar. Bu da e-ticaret ya da büyük ölçekli bir proje için istenmeyen bir durum oluşturmaktadır. Elasticsearch, büyük veriler arasında hız kaybı yaşanmadan arama yapılmasını sağlayan döküman tabanlı, NoSQL bir veritabanıdır. Elasticsearch’ın yapılma amacı aramalardaki bu kritik sorunun çözümünü sağlamaktır.
Elasticsearch ilk olarak, Apache Software Foundation’ın Lucene isimli belge arama kütüphanesi kullanılarak yapılmaya başlanmış ve 2010 yılında ortaya çıkmış. Java diliyle yazıldığı için her platformda çalışabilecek şekilde ölçeklenebilmektedir. Elasticsearch projelerin genelde tam-metin araması, otomatik tamamlama, gerçek zamanlı raporlama ve günlük tutma fonksiyonlarında kullanılır.
RDBMS’lerde “satır” olarak bilinen terim, Elasticsearch’te “döküman” olarak geçer. Her bir döküman JSON formatında saklanır. Tüm veritabanı işlemleri Elasticsearch’ün restful API servisi ile yapılır. Restful servisinin varsayılan portu 9200’dür. Kullandığı methodlar GET, POST, PUT, HEAD ve DELETE’tir.
RDBMS yapısının Elasticsearch’teki karşılıklarını aşağıdaki tablodan görebilirsiniz:
İlişkisel Veritabanları | Elasticsearch |
---|---|
Database | Index |
Table | Type |
Row/Record | Document |
Column | Field |
Elasticsearch’ü kullanmak için bir tane http client gerekiyor. Postman ya da komut satırında çalışmak istiyorsanız httpie bu iş için önerebileceğim programlardır.
Veritabanı işlemleri yaparken kullanacağımız link yapısı aşağıdaki gibi olmalı:
{protokol}://{host}:{port}/{index}/{type}/{id}
Elasticsearch’ü bir örnek ile anlamaya çalışalım. Bu örnekte bir ürün listesi yapalım. Ürünleri başlığına, açıklamasına, eklendiği tarihe, etiketlerine göre filitreleyeceğiz. İlk olarak birkaç kayıt ekleyelim. Kayıt eklemek için PUT methodunu kullanıyoruz.
PUT /ekinshop/products/1
{
"title":"Raspberry Pi 3 B+",
"description":"Raspberry Pi küçük bir bilgisayardır. Her bilgisayarda olan işlemci, RAM ve depolama birimi bulunur.",
"created_at":"2019-05-09",
"tags":[
"bilgisayar",
"raspberry pi"
]
}
İsteği gönderdikten sonra bize işlemin sonucunu gösteren bir sonuç dönüyor.
{
"_index":"ekinshop",
"_type":"products",
"_id":"1",
"_version":1,
"result":"created",
"_shards":{
"total":2,
"successful":1,
"failed":0
},
"_seq_no":0,
"_primary_term":1
}
Şimdi bir kaç tane daha ürün ekleyelim.
PUT /ekinshop/products/2
{
"title":"PIC18F252 8-Bit 40 MHz Mikrodenetleyici",
"description":"SOIC-28 türünde, 40 MHz frekansı ile çalışan 8-Bit değerinde bir mikrodenetleyicidir.",
"created_at":"2019-04-10",
"tags":[
"mikrodenetleyici",
"soic-28"
]
}
PUT /ekinshop/products/3
{
"title":"Weller WHS40D Lehim İstasyonu",
"description":"Weller WHS40D, 40W gücünde ve 450 celsius'a kadar ısıtma sağlar.",
"created_at":"2019-04-10",
"tags":[
"havya",
"lehim",
"weller"
]
}
Üçüncü kayıttan sonraki sonuç çıktısı bu şekilde oluyor:
{
"_index":"ekinshop",
"_type":"products",
"_id":"3",
"_version":1,
"result":"created",
"_shards":{
"total":2,
"successful":1,
"failed":0
},
"_seq_no":2,
"_primary_term":1
}
Şimdi eklediğimiz kayıtları çekmeye çalışalım. Bunu GET methoduyla yapıyoruz.
GET /ekinshop/products/3
Bu bize aşağıdaki çıktıyı veriyor:
{
"_index":"ekinshop",
"_type":"products",
"_id":"3",
"_version":1,
"_seq_no":2,
"_primary_term":1,
"found":true,
"_source":{
"title":"Weller WHS40D Lehim İstasyonu",
"description":"Weller WHS40D, 40W gücünde ve 450 celsius'a kadar ısıtma sağlar.",
"created_at":"2019-04-10",
"tags":[
"havya",
"lehim",
"weller"
]
}
}
Tüm kayıtları çekebilmek için {id} kısmına “_search” yazıyoruz. Örnek:
GET /ekinshop/products/_search
Şimdi kayıtlar arasında filitreleme yapalım. Bunun için yine “_search” methodunu kullanıyoruz. Bu sefer ?q=
query parametresini kullanıyoruz.
GET /ekinshop/products/_search?q=title:weller
Bu istek bize başlığında “weller” geçen tüm ürünleri listeliyor. Aynı şekilde array türünde eklediğimiz anahtar kelimeler arasında da arama yapabiliyoruz.
GET /ekinshop/products/_search?q=tags:havya
Yapacağımız arama işlemi, URI’ye sığmayacak kadar uzun mu? O halde JSON ile yapalım. Bu sayede en komplike aramaları basit bir sözdizimiyle yapabiliriz.
GET /ekinshop/products/_search
{
"query":{
"bool":{
"filter":{
"terms":{
"tags":[
"havya",
"weller"
]
}
}
}
},
"sort":[
{
"created_at":{
"order":"desc"
}
}
]
}
Bu istekle anahtar kelimede “havya” ve “weller” geçen tüm ürünleri listeletip, eklenme tarihini de yeniden-eskiye doğru sıralattık.
Ayrıca aramaları Levenshtein mesafe algoritması kullanılarak da yaptırabilirsiniz. Bu sayede yazım yanlışı yapılsa bile aranmak istenen kayda ulaşılabilir:
{
"query": {
"fuzzy": {
"title": "wellerr"
}
}
}
Sayfalama işlemi? Bu da basit. “size” ve “from” parametrelerini kullanarak kayıtları limitlendirip, offset’ini ayarlayabilirsiniz.
GET /ekinshop/products/_search?size=5&from=5
Kayıt güncellemek için, kayıt eklemede kullandığımız PUT yerine POST methodunu kullanıyoruz. örneğin POST /ekinshop/products/3
, önceki kayıtların üzerine yazarak kaydın güncellenmesini sağlar.
Silmek için de GET yerine DELETE methodunu kullanıyoruz. Sadece bir kayıt silmek istiyorsak DELETE /ekinshop/products/3
, bütün index’i silmek istiyorsak DELETE /ekinshop
isteğini göndermeliyiz.
Bu noktadan sonra yapmanız gereken, Elasticsearch’ü ana veritabanınızla birlikte kullanılabilir hale getirmek. Verileri Elasticsearch’e otomatik aktaran bir bot yazabilirsiniz ya da zombodb gibi bir Postgresql eklentisi kullanabilirsiniz. Ancak Amazon Web Services RDS ve Aurora’da üçüncü parti bir eklenti izin verilmediği için Elasticsearch’ün kendi programı Logstash kullanabilirsiniz. Logstash ile ilişkisel veritabanınızdaki verileri otomatik olarak Elasticsearch’e aktarabilirsiniz. Elasticsearch’ün bir ürünü olmasının yanı sıra, JDBC input eklentisinin oluşuyla birçok veritabanı ile entegre olabilmesi ve sütun takibi yaptırtarak modifiye edilmiş kayıtları alabildiğiniz için Logstash kullanmanızı şiddetle öneriyorum.
Bu makalede Elasticsearch’ün kullanım mantığıyla ilgili temel bilgileri paylaştım. Eğer daha detaylı olarak bilgi almak isterseniz Elasticsearch’ün kendi kullanım klavuzundan örneklere ulaşabilirsiniz.