elasticsearch — mapping

kurkoc
2 min readNov 15, 2022

--

bu yazıda elasticsearch mapping kavramına değineceğiz.

bildiğiniz gibi; geleneksel veritabanı yönetim sistemlerinde tablolarımıza veri eklemeden önce DDL marifetleriyle kullanmak istediğimiz alanların isimlerinin, tiplerinin belirlenmiş olması gerekiyor. bazı yeni nesil yaklaşımlarda -özellikle doküman tabanlı database ve veri saklama yapılarında- veri henüz aktarılırken tip analizi yapılarak bir veri modeli oluşturulabilmektedir. elasticsearch bahsi geçen bu iki yönteme de izin vermektedir.

mapping; elasticsearch üzerinde depolamak istediğimiz dokümanın ve o dokümana ait alanların nasıl saklanacağı/indexleneceği ile ilgilenen süreçtir. bu açıdan bakarsak belki de en önemli süreçlerden birisidir diyebiliriz. doğru ve efektif kurgulanması önemlidir, çünkü milyonlarca/milyarlarca veriyi depolamaya başlamadan önce doğru şekilde kurgulamazsak sonrasında süreç tekrarlarına ve zaman kaybına sebep olacaktır.

elasticsearch’de iki adet mapping tipi vardır. bunlar dynamic mapping ve explicit mapping’dir.

dynamic mapping

eklenenen dokümanın sahip olduğu alanlardaki verilere göre, veri tiplerinin tespitinin elasticsearch tarafından otomatik olarak yapıldığı mapping tipidir.

POST /artist/_doc/1
{
"first_name": "phoebe",
"last_name" : "bridgers",
"age" : 28
}

temiz bir elasticsearch node’u üzerinde ilk queryimizi yukardaki gibi çalıştıralım.

bu query sonucunda artist isminde bir index oluşturuldu ve 1 nolu id’ye request bodysinde gönderilen doküman eklendi. elasticsearch bu işlem için önden bir index oluşturma ya da veritabanı sistemlerindeki gibi kolonları belirleme gibi bir işlem talep etmedi bizden. otomatik olarak ekledi ve yazımızın konusu olan mapping işlemini de bizim yerimize otomatik olarak yaptı.

GET /artist/_mapping

komutu ile oluşturulan index için oluşan mapping tanımına bakarsak eğer;

{
"artist": {
"mappings": {
"properties": {
"age": {
"type": "long"
},
"first_name": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"last_name": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
}
}
}
}
}

mapping tanımına bakarsak eğer; age, first_name, last_name alanlarının çeşitli veri tipleri ile beraber bizim için otomatik olarak oluştuğunu görebiliriz.

oluşturduğumuz index’e yeni alanlar içeren bir doküman daha eklersek eğer map tanımı bu yeni alanları da içerecek şekilde güncellenir. (Bu default davranıştır dynamic parametresi ile bu davranış değiştirilebilir)

POST /artist/_doc/2
{
"first_name": "lucy",
"last_name" : "dacus",
"age" : 27,
"email" : "lucy@dacus.net"
}

bu yeni dokümanda önceki dokümanda olmayan email isminde bir alan daha var. bu sebeple önceki map tanımına text tipinde bir email alanı da otomatik olarak eklenir. bu davranış “dynamic field mapping” olarak geçmektedir ve istenildiğinde kapatılabilmektedir.

explicit mapping

elasticsearch ile çalışırken, saklayacağımız veri modelini iyi bildiğimizden, oluşacak index map yapısını kendimiz belirleyebiliriz. bu sayede oluşabilecek performans kayıpları önlenip, alanlar üzerinde daha fazla kontrol sahibi olabiliriz.

PUT /artistv2
{
"mappings": {
"properties": {
"first_name": { "type": "text" },
"last_name": { "type": "text" },
"age": { "type": "integer" }
}
}
}

az önceki index ile benzer formatta bir artistv2 index’i oluşturduk. ancak bu sefer mapping tanımını bilinçli bir şekilde kendimiz tanımladık.

GET /artistv2/_mapping

oluşan mapping tanımına bakarsak;

{
"singerv2": {
"mappings": {
"properties": {
"age": {
"type": "integer"
},
"first_name": {
"type": "text"
},
"last_name": {
"type": "text"
}
}
}
}
}

dynamic mapping işleminde olduğu gibi burada da, mevcut mapping tanımında olmayan bir alan içeren yeni bir doküman eklendiğinde, ilgili alan mapping tanımına dinamik olarak eklenecektir.

eğer istersek bu alan ekleme işlemini manuel olarak kendimiz de yapabiliriz.

PUT /artistv2/_mapping
{
"properties": {
"bio": {
"type": "keyword"
}
}
}

--

--