Çekirdek ElasticSearch İşlemleri

Bundan önce, ElasticSearch’ü sizlere tanıtmayı amaçlayan makalede ifade edildiği gibi, ElasticSearch RESTfull Api’ye yöneliktir. Hemen hemen her eylem RESTfull API ile, HTTP üzerinden JSON kullanarak gerçekleştirilebilir. Bu sebeple bugün, temel ElasticSearch operasyonlarını, kodcu.com’da yayınlanan makaleleri başlık, içerik, yayınlanma tarihi, etiket ve yazar bilgisi ile endeksleyen varsayımsal bir örnekle curl(client url library) kullanarak gerçekleştireceğiz.

 

Endeks oluşturmak

Create Index API, bir endeks örneğini sağlar. ElasticSearch çoklu endeks ve endeksler arası işlemlerin yürütülmesini de destekler. Oluşturulan her endeks için özel ayarlar sağlanabilir.

hakdogan:~ hakdogan$ curl -XPUT 'http://localhost:9200/kodcucom/' -d '
> index:
> number_of_shards: 2
> number_of_replicas: 1
> '

Bu komutla, kodcucom isminde, shards ve replicas sayısını da belirterek bir endeks oluşturduk.

ElasticSearch’te bir shard, tek lucene örneğidir. Otomatik olarak yönetilir. Varsayılan olarak, bir endeksin 5 primary shard’ı vardır. Varsayılan shard sayısını config/elasticsearch.yml dosyasında belirleyebilirsiniz. Bu örnekte görüldüğü gibi bu sayı oluşturulan endekse özel olarak da değiştirilebilir. Bir endeks oluşturulduktan sonra, primary shards sayısı değiştirilemez.

Elasticsearch kümedeki tüm düğümler arasında shard’ları dağıtır ve bir düğüm hatası yaşandığında, ya da yeni bir düğüm eklenmesi durumunda otomatik olarak shard’ları taşır.

Daha önce ifade edildiği gibi, ElasticSearch kendisine gönderilen kaydı çözümleyerek endeks ve tip bilgisini standart ayarlarla otomatik olarak oluşturabiliyor.

hakdogan:~ hakdogan$ curl -XPUT localhost:9200/kodcucom/article/1 -d '{
> title: "Java API for JSON Processing - Stream-based JSON Produce and Consume",
> content: "Java API for JSON Processing (JSON-P) standard under the umbrella of the Java EE 7 in the JSR-353 specification is an enterprise java technology.",
> postDate: "2013-08-06T12:00:00",
> tags: ["Java"],
> author: "Rahman Usta"
> }'
{"ok":true,"_index":"kodcucom","_type":"article","_id":"1","_version":1}

Dolayısıyla yukarıdaki komutla, kodcucom adında bir endeks, article adında bir tip standart ayarlarla oluşturdu ve Id değeri 1 olan kayıt(JSON belgesi), ElasticSearch’te depolandı.

 

Doküman almak

ElasticSearch Get API, id değeri belirtilen dokümanı almayı sağlar.

hakdogan:~ hakdogan$ curl -XGET localhost:9200/kodcucom/article/1?pretty=true
{
  "_index" : "kodcucom",
  "_type" : "article",
  "_id" : "1",
  "_version" : 1,
  "exists" : true, "_source" : {
title: "Java API for JSON Processing - Stream-based JSON Produce and Consume",
content: "Java API for JSON Processing (JSON-P) standard under the umbrella of the Java EE 7 in the JSR-353 specification is an enterprise java technology.",
postDate: "2013-08-06T12:00:00",
tags: ["Java"],
author: "Rahman Usta"}
}

Varsayılan olarak Get API gerçek zamanlıdır ve endeksin yenileme hızını etkilemez. Bir doküman alırken, çekilecek alanları belirleyebilirsiniz. Parametre geçirerek, alma işleminin alanlar kümesi döndürmesi sağlanabilir.

hakdogan:~ hakdogan$ curl -XGET localhost:9200/kodcucom/article/1?fields=title,author
{
"_index":"kodcucom",
"_type":"article",
"_id":"1",
"_version":1,
"exists":true,
"fields": {
"author":"Rahman Usta",
"title":"Java API for JSON Processing - Stream-based JSON Produce and Consume"}
}

 

Çoklu doküman almak

Multi Get API, endeks, tip(opsiyonel) ve id’ye dayalı birden çok belge almayı sağlar. Yanıt, çekilen dokümanlarla bir dokümanlar dizisi içerir.

hakdogan:~ hakdogan$ curl localhost:9200/_mget -d '{
> docs: [
>          {
>           _index: "kodcucom",
>           _type: "article",
>          _id: "1"
>         },
>        {
>        _index: "kodcucom",
>        _type: "article",
>        _id: "2"
>       }
>            ]
> }'
{
   "docs": [
                {"_index":"kodcucom",
                 "_type":"article",
                 "_id":"1",
                 "_version":1,
                 "exists":true, 
                 "_source" : {
                 title: "Java API for JSON Processing - Stream-based JSON Produce and Consume",
                 content: "Java API for JSON Processing (JSON-P) standard under the umbrella of the Java EE 7 in the JSR-353 specification is an enterprise java technology.",
                 postDate: "2013-08-06T12:00:00",
                 tags: ["Java"],
                 author: "Rahman Usta"}
},
                {
                 "_index":"kodcucom",
                 "_type":"article",
                 "_id":"2",
                 "_version":1,
                 "exists":true, 
                 "_source" : {
                 title: "Core ElasticSearch Operations",
                 content: "Elasticsearch is RESTful API driven",
                 postDate: "2013-08-13T09:00:00",
                 tags: ["elasticsearch, big-data"],
                 author: "Hüseyin Akdoğan"}
}
]
}

Mget end point‘i endeks ve tip bilgisi ile birlikte de kullanılabilir.

hakdogan:~ hakdogan$ curl localhost:9200/kodcucom/_mget -d '{
> docs: [
>          {
>           _type: "article",
>          _id: "1"
>         },
>        {
>        _type: "article",
>        _id: "2"
>       }
>        ]
> }'
hakdogan:~ hakdogan$ curl localhost:9200/kodcucom/article/_mget -d '{
> docs: [
>          {
>          _id: "1"
>         },
>        {
>        _id: "2"
>       }
>        ]
> }'

Daha basit bir istek için ids elemanı kullanılabilir.

hakdogan:~ hakdogan$ curl localhost:9200/kodcucom/article/_mget -d '{
> ids: ["1", "2"]
> }'

Son olarak, spesifik alan getirimini görelim.

hakdogan:~ hakdogan$ curl localhost:9200/_mget -d '{
> docs: [
>           {
>            _index: "kodcucom",
>            _type: "article",
>            _id: "1",
>            fields: ["title", "author"]
>          },
>         {
>           _index: "kodcucom",
>           _type: "article",
>           _id: "2",
>          fields: ["postDate", "tags"]
>         }
>        ]
> }'

 

Arama

Search API, bir arama sorgusu yürütmenizi ve eşleşen sonuçları almanızı sağlar. Sorgu işlemi ya parametre olarak basit bir sorgu dizesi ya da istek gövdesi kullanarak gerçekleştirilir. Aşağıda her iki kullanımın(istek gövdesi kullanan örnek range query de içermektedir) bir örneğini görüyorsunuz..

hakdogan:~ hakdogan$ curl -XGET localhost:9200/kodcucom/article/_search?fields=title,author
hakdogan:~ hakdogan$ curl -XGET localhost:9200/kodcucom/article/_search -d '{
> query: {range: {postDate: {from: "2013-01-01", to: "2013-08-13"}}}
> }'

 
Güncelleme

ElasticSearch Update API, script güncellemesi ve mevcut dokumanla birleştirilecek bir kısmi doküman gönderimi ile güncellemeye destek sağlar. ElasticSearch güncelleme işleminden emin olmak için versiyonlama(ElasticSearch’te endekslenmiş her doküman sürümlenir) kullanmaktadır. Güncelleme, dokümanın full reindex edilmesi anlamına gelir.

hakdogan:~ hakdogan$ curl -XPOST localhost:9200/kodcucom/article/1/_update -d '{
> script: "ctx._source.tags += tag",
> params: {
> tag: "json-p"}
> }'
{"ok":true,"_index":"kodcucom","_type":"article","_id":"1","_version":2}

Yukarıda bir script güncellemesi görüyorsunuz. ElasticSearch scripting modülü, özel ifadeleri değerlendirmek için scripts kullanmanıza olanak sağlıyor. Scripting modülü varsayılan olarak mvel dilini kullanır. Lang plugin’ler ile farklı dilde(örn JavaScript, Groovy, Python) script çalıştırılmasına da izin verilmektedir.

Tekrar yukarıdaki komuta dönersek, komutta yer alan ctx, script bağlamıdır. Script bağlamıyla, dokümanın _source alanı üzerinden “tags” alanı güncellenmiştir. Bir script, parametre de kullanabilir. Burada params kullanımına dikkat edin. Tag parametresine “params” kısmında değer set edilmiştir.

Script güncellemesiyle dokümana yeni bir alan ekleyebilirsiniz.

hakdogan:~ hakdogan$ curl -XPOST localhost:9200/kodcucom/article/1/_update -d '{
> script: "ctx._source.temporaryField = "temporary text""
> }'
{"ok":true,"_index":"kodcucom","_type":"article","_id":"1","_version":3}

Silebilirsiniz de.

hakdogan:~ hakdogan$ curl -XPOST localhost:9200/kodcucom/article/1/_update -d '{
> script: "ctx._source.remove("temporaryField")"
> }'
{"ok":true,"_index":"kodcucom","_type":"article","_id":"1","_version":4}

Üretilen çıktıdaki version bilgisine lütfen dikkat edin. Update API, mevcut belgeyle birleştirilecek bir kısmi belge gönderimini de desteklemektedir.

hakdogan:~ hakdogan$ curl -XPOST localhost:9200/kodcucom/article/1/_update -d '{
doc: {                                                                        
author: "RAHMAN USTA"                                                                                                                                        
}                               
}'
{"ok":true,"_index":"kodcucom","_type":"article","_id":"1","_version":5}

Dikkat edilmesi gereken bir nokta, doc, script ile birlikte belirtilirse gözardı edilir. ElasticSearch, önceden yüklenmiş script(preloaded scripts) desteği de sağlamaktadır.

 

Silme

ElasticSearch Delete API’yi incelemeden önce, script ile bir alanın sahip olduğu değere bağlı olarak doküman(kayıt) silinebileceğini belirtelim.

hakdogan:~ hakdogan$ curl -XPOST localhost:9200/kodcucom/article/1/_update -d '{
script: "ctx._source.tags.contains(tag) ? ctx.op = "delete" : ctx.op = "none"",
params: { tag: "Java"}
}'
{"ok":true,"_index":"kodcucom","_type":"article","_id":"1","_version":6}hakdogan:~ hakdogan$ 
hakdogan:~ hakdogan$ curl -XGET localhost:9200/kodcucom/article/1?pretty=true
{
  "_index" : "kodcucom",
  "_type" : "article",
  "_id" : "1",
  "exists" : false
}

Delete API, id değeri belirtilen dokümanı silmenizi sağlar.

hakdogan:~ hakdogan$ curl -XDELETE localhost:9200/kodcucom/article/1
{"ok":true,"found":true,"_index":"kodcucom","_type":"article","_id":"1","_version":2}

Delete Index API ise, bir endeksi silmenizi sağlar.

hakdogan:~ hakdogan$ curl -XDELETE localhost:9200/kodcucom

Delete Index API, varsayılan olarak birden fazla endekse uygulanabilir.

hakdogan:~ hakdogan$ curl -XDELETE localhost:9200

Tüm endeksleri silme iznini devre dışı bırakmak için, action.disable_delete_all_indices true olarak ayarlanmalıdır.

2 Comments

Post a Comment

Comment
Name
Email
Website