December 06, 2015

Mapping Nedir?

 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.

Kaynakça