본문 바로가기

Backend/ELK

Elastic Search Mapping Type

이전 포스트

 

Elastic Search Data Type

이전 포스트 Elastic Search 버전 별 차이점 이전 포스트 Elastic Search 추상화 개념 이전 포스트 Elastic Search의 가장 큰 특징이라면 RDBMS와 다르게 Document 지향적이며, 이를 일급 객체로 취급하는 것입니.

pcloud.tistory.com


Mapping Type

이전 포스트의 예제 중 /message/_doc/1 색인을 진행하였다면, 모르는 사이 자동으로 Mapping이 생성되었을 것입니다.

Mapping은 Index에 삽입될 Field의 Data Type을 정의하는 것을 말합니다.

Mapping을 하지 않았지만 GET /message/_doc/1을 진행할 수 있던 이유는 Elastic Search에서 Index와 Mapping에 대한 정보를 자동으로 생성했기 때문입니다.

즉, 무작정 index 정의 없이 색인을 하더라도 Elastic Search는 자동으로 문서의 내용을 확인하고 최선의 DataType을 지정(Mapping) 해주기 때문에 과정을 생략할 수 있습니다.

예시

우선 아래의 예제를 입력해보겠습니다.

 

예제

PUT /message/_doc/2 {
	"name" : "Go Gil-dong",
	"message" : "아아 이 서늘하고도 묵직한 감각",
	"targetName": "Dooly",
	"date" : "2020-12-28T17:17:25"
}

기존에 입력한 /catalog/product/1 의 Field이 한 가지 추가되었습니다. (targetName)

 

예제 결과

GET 을GET을 통해 방금 색인한 데이터를 확인하겠습니다.

{ 
  "_index" : "message",
  "_type" : "_doc",
  "_id" : "2",
  "_version" : 6,
  "_seq_no" : 6,
  "_primary_term" : 1,
  "found" : true,
  "_source" : 
  { 
    "name" : "Go Gil-dong",
    "message" : "아아 이 서늘하고도 묵직한 감각",
    "targetName" : "Dooly",
    "date" : "2020-12-28T17:17:25"
  } 
}

공통으로 들어간 Field 인 name, message, date를 Common Field 라합니다. 이는 개별 Document를 message로 식별할 수 있도록 해줍니다.

위처럼 Elastic Search에서는 RDBMS와 달리 각 Document를 미리 정의하지 않아도 정상 작동하며, message라고 지정한 index도 미리 생성할 필요가 없습니다.

mapping 정보 확인하기

GET /message/_mapping 요청을 통해 확인하겠습니다.

{
   "message":{
      "mappings":{
         "properties":{
            "date":{
               "type":"date"
            },
            "message":{
               "type":"text",
               "fields":{
                  "keyword":{
                     "type":"keyword",
                     "ignore_above":256
                  }
               }
            },
            "name":{
               "type":"text",
               "fields":{
                  "keyword":{
                     "type":"keyword",
                     "ignore_above":256
                  }
               }
            },
            "targetName":{
               "type":"text",
               "fields":{
                  "keyword":{
                     "type":"keyword",
                     "ignore_above":256
                  }
               }
            }
         }
      }
   }
}

이를 통해 직접 index 및 mapping을 정의하지 않더라도 얼추 원하는 Data type이 적용된 것을 확인할 수 있습니다.

직접 mapping 하기

Elastic Search가 자동으로 Mapping 을 정의하여 편한 점은 있지만 한 가지 문제가 발생합니다.

한번 정의된 mapping은 변경되지 않는 점입니다.

새로운 Field를 추가하거나 새로운 Type의 Mapping을정의할 수 있지만 기존에 정의한 내용을 변경하거나 되돌릴 수 없습니다.

또한 원하는 format, filter 등을 지정하기 위해선 직접 Index와 Mapping을 정의해야 합니다. (서로 다른 것입니다.)

  • Mapping 정의는 mappings 작성을 의미합니다.
  • 인덱스 작성(선언) 은 PUT message {"settings": {...}, "filter":{...}} 같은 작성을 의미합니다.

예제

예제 진행을 위해 기존 message Index를 삭제하고 진행해주세요.

delete /message

"PUT message"{
   "mappings":{
      "properties":{
         "name":{
            "type":"text",
            "fields":{
               "keyword":{
                  "type":"keyword",
                  "ignore_above":256
               }
            }
         },
         "targetName":{
            "type":"text",
            "fields":{
               "keyword":{
                  "type":"keyword",
                  "ignore_above":256
               }
            }
         },
         "date":{
            "type":"date",
            "format":"yyyy-MM-dd HH:mm:ss||yyyy/MM/dd||epoch_millis"
         }
      }
   }
}

 

예제 결과

{
   "message":{
      "mappings":{
         "properties":{
            "date":{
               "type":"date",
               "format":"yyyy-MM-dd HH:mm:ss||yyyy/MM/dd||epoch_millis"
            },
            "name":{
               "type":"text",
               "fields":{
                  "keyword":{
                     "type":"keyword",
                     "ignore_above":256
                  }
               }
            },
            "targetName":{
               "type":"text",
               "fields":{
                  "keyword":{
                     "type":"keyword",
                     "ignore_above":256
                  }
               }
            }
         }
      }
   }
}

데이터 삽입

PUT /message/_doc/1{
   "name":"Go Gil-dong",
   "message":"아아 이 서늘하고도 묵직한 감각",
   "targetName":"Dooly",
   "date":"2020-12-28 17:17:25"
}"결과 (GET)"{
   "_index":"message",
   "_type":"_doc",
   "_id":"1",
   "_version":1,
   "_seq_no":0,
   "_primary_term":1,
   "found":true,
   "_source":{
      "name":"Go Gil-dong",
      "message":"아아 이 서늘하고도 묵직한 감각",
      "targetName":"Dooly",
      "date":"2020-12-28 17:17:25"
   }
}

다음 포스트

 

'Backend > ELK' 카테고리의 다른 글

Elastic Search CRUD  (0) 2021.05.02
Elastic Search Inverted Index  (0) 2021.05.01
Elastic Search Data Type  (0) 2021.04.29
Elastic Search 버전 별 차이점  (0) 2021.04.27
Elastic Search 추상화 개념  (0) 2021.04.27