Yazı hakkında bir yorum bırakmak için tıklayın.
Bu yazıya sizde katkıda bulunabilirsiniz.
Bir önceki yazımda daha çok Type kavramından bahsetmiştim. Mapping hakkında da
kısa bir kaç cümle söylemiştim. Elasticsearch’de mapping verilerin index’lerde nasıl
tutulacağını belirleyen yapılarıdır. Normalde Lucene’de mapping yapısı yoktur. Lucene’de
veriler field-value olarak tutulur ve değerlerin sayı, string ya da tarih mi olduğunu
önemsemez. Tüm değerler opaque bytelar halinde tutulur.
Elasticsearch’ün en güzel özelliklerinden birisi hızlıca verilerini oluşturabilrmenizi ve
erişebilmenizi sağlar. Bir dökümanı index’lemek için bir index oluşturmanıza ya da bir
mapping type belirlemenize, alanlarınızı tanımlamanıza gerek yoktur.
PUT core_index/user/1
{
"name": "Haydar KULEKCI",
"age" : 1
}
ES otomatik olarak anlayacaktır ve bir index bir type ve alanlarınız otomatik olarak
tiplerinize göre oluşturacaktır. Yukarıdaki sorguyu çalıştırdığınızda aşağıdaki gibi bir
mapping otomatik olarak oluşacaktır.
{
"core_index": {
"mappings": {
"user": {
"properties": {
"age": {
"type": "long"
},
"name": {
"type": "string"
}
}
}
}
}
}
Gördüğünüz gbi name alanı string olarak age alanı da long olarak tanımlandı.
ES’de yeni bir veriyi içeri almak aslında bu kadar kolay. İşler her zaman ub kadar da
kolay olmayabiliyor. Bazı veriler sayı gelse dahi string olarak tutmamız gerekebilir.
Ya da ilk değer sayı denk gelen bir index oluşturmuş olabiliriz. Ilk olarak long olarak
otomatik oluşturulmuş alana daha sonrasında string geldiğinde sıkıntı yaşayabiliriz.
Her bir index’te bir veya daha fazla type vardır. Bu typelar index’leri belirli gruplara
böler. Her bir type‘daki dökümanlarda dökümanı ilişkilendirmek için kullanılan
_index, _type, _id ve _source gibi meta alanlar(field) vardır. Bunlar dışında
kendi belirleyeceğiniz alanlarınız yani propertiesler vardır.
Daha iyi anlamak için bir örnek belirleyelim ve bunun üzerinden devam edelim. Aşağıda
aynı index içerisinde iki type tanımlayalım ve bunların mapping bilgilerini yani index’te
verilerin nasıl tutulacağını biz belirleyelim.
POST core_index
{
"index": {
"number_of_replicas": "1",
"number_of_shards": "2"
},
"mappings": {
"user": {
"_all": {
"enabled": false
},
"properties": {
"title": {
"type": "string"
},
"name": {
"type": "string"
},
"age": {
"type": "integer"
}
}
},
"post": {
"properties": {
"title": {
"type": "string"
},
"body": {
"type": "string"
},
"user_id": {
"type": "string",
"index": "not_analyzed"
},
"created": {
"type": "date"
}
}
}
}
}
Yukarıdaki index’i oluştururken görüldüğü üzere user ve post adında iki tane type
oluşturuyoruz ve mapping bilgilerini yazıyoruz. Typelarda alanları properties alanı
altında belirtiyoruz. Properties altındaki yapı aşağıdaki gibidir:
"field-name": {
"type": "type-name",
"other-attribute-name": "value"
},
field-name kısmını siz alana vereceğiniz ismi yazıyorsunuz ve type-name kısmına da o
alanın tipini yazıyorsunuz. Yukarıda göreceğiniz gibi user type‘ı için title, name, age
alanları var ve sırasıyla string, string ve integer tipinde. Aynı index’teki post typeınde
ise title, body, user_id ve created alanları bulunuyor ve bu alanlar sırasıyla string,
string, string ve date tipindedir.
Elasticsearch’te string, date, long, double, boolean ve ip basit tipleri mevcuttur.
Bunlar dışında object ve nested tipleri bulunmaktadır. Daha özelleşmiş olan geo_point,
geo_shape, ve completion tipleri de bulunmaktadır. Tİpleri ilerleyen zamanlarda
kullandıkça açıklayacağız. Yine de erkenden bilgi sahibi olmak isterseniz
buradan
bilgi alabilirsiniz.
Yukarıdaki örnekte göreceğiniz post type’ındaki user_id alanında index diye ayrı bir
özellikte mevcut. Bu özellik alandaki değerin nasıl index’e alınacağını belirler. Eğer bu alan
hiç yazılmaz ise standart analyzer ile analiz edilerek index’e alınır. Buraya kendi
oluşturduğunuz analyzerları ya da varsayılanları kullanabilirsiniz.