Elasticsearch — Search Templates

Cem DURAK
blutv
Published in
3 min readSep 13, 2021

Merhaba 👋 , bu yazımda Elasticsearch kullanımında yeni karşılaştığım Search Template özelliğinin nasıl kullanılabileceği ve getirdiği avantajları anlatmaya çalışacağım.

Örneklerle anlatabilmek icin bu özelliğin kullanıldığı ve kullanılmadığı durumları basit bir senaryo ile inceleyeceğiz. Klasik şekilde, örneklerden önce tanım ile başlayalım!

Search Template Nedir?

Search Template, search sorgularını şablon halinde sunucularda kaydedebilmeyi ve kaydettiğimiz şablon sorguyu farklı değişkenler ile çalıştırmayı sağlayan Elasticsearch özelliğidir.

Senaryo Hazırlık

Sorgulama aşamasına geçmeden önce veritabanımızı hazırlayalım. Bu aşamada Docker kullanmak işimizi kolaylaştıracaktır.

Kibana burada isteğe bağlı. Kibana’nın Dev Tools arayüzü Elasticsearch isteklerini kolayca gönderebileceğimiz ortam sağlıyor. curl ile terminal üzerinden de bu istekler gönderilebilir.

kibana-dev-tools

Senaryomuzda film, dizi gibi izlenebilir içeriklerimizi Elasticsearch’e kaydedip sorgulayacağız. Bunun için index’e ihtiyacımız var. Index oluşturmak için:

PUT contents

İçeriğin başlığı, tipi, türü ve izlenme sayısı Elasticsearch’te kayıtlı olsun:

PUT contents/_mapping
{
"properties": {
"title": {
"type": "text"
},
"content_type": {
"type": "keyword"
},
"genre": {
"type": "keyword"
},
"view_count": {
"type": "integer"
}
}
}

Örnek içerik verisi:

{
"title": "Movie Watched By a Thousand",
"content_type": "movie",
"genre": "action",
"view_count": 1000
}

Bundan önceki komutları Kibana ile yaptık. curl kullanımına örnek olması açısından içeriği curl ile ekleyelim:

curl -H "Content-Type:application/json" -XPOST localhost:9200/contents/_doc -d '{"title":"Movie Watched By a Thousand","content_type":"movie","genre":"action","view_count":1000}'

Veritabanını hazırlama aşamasını bitirmiş olduk.Sorgulama aşamasına geçebiliriz.

Template kullanmadığımızda nasıl sorgularız?

Aksiyon filmlerini izlenilenme sayılarına göre, en çok izlenilen ilk sırada gelecek şekilde sıralamak istiyorsak template kullanmadığımız durumda Elasticsearch’e gidecek istek şöyle olmalı:

GET /contents/_search
{
"query": {
"bool": {
"must": [
{
"match": {
"content_type": "movie"
}
},
{
"match": {
"genre": "action"
}
}
]
}
},
"sort": [
{
"view_count": {
"order": "desc"
}
}
]
}

Template tanımlamış olsaydık nasıl sorgu gönderirdik?

Tanımlayacağımız template istenilen içerik tip, tür ve sıralama değerlerini parametrik olarak almalı. Gönderilen parametrelere göre içerikler üzerinde filtreleme ve sıralama yapmalı.

PUT _scripts/sort-contents
{
"script": {
"lang": "mustache",
"source": {
"query": {
"bool": {
"must": [
{
"match": {
"content_type": "{{content_type}}"
}
},
{
"match": {
"genre": "{{genre}}"
}
}
]
}
},
"sort": [
{
"{{sort}}": "{{order}}"
}
]
}
}
}

Göndermiş olduğumuz istek ile sort-contents isimli bir template tanımlanmış oldu.Template tanımladıktan sonra aksiyon filmlerini çektiğimiz sorgunun son hali:

POST /contents/_search/template
{
"id": "sort-contents",
"params": {
"content_type": "movie",
"genre": "action",
"sort": "view_count",
"order": "desc"
}
}

Python client örneği:

Sonuç

Template kullandığımızda sorgunun yapısı Elasticsearch’te saklandığı için uygulama kodları sorgu dili ile uğraşmadan sadece değişkenleri ileterek sorgulayabiliyor.

Sorgunun Elasticsearch’te saklanması, sorguda değişiklik gerektiği durumda uygulama kodlarını degiştirmeden bu değişikliği yapabilme esnekliğini de bize getiriyor.

Gönderilen isteklerde taşınan verinin boyutu ve karmaşıklığı göz önüne alındığında template kullanmak daha basit ve küçük boyutlarda veri taşımamızı sağlıyor. Taşınan verinin boyutuna göre ücretlendirme yapılan cloud dünyasında, sunuculara yapılan istek sayısı ne kadar fazla ise template kullanmanın önemi o kadar artıyor.

Umarım sizin için de faydalı olmuştur. Bir sonraki yazıda görüşmek üzere!

--

--