본문 바로가기

Monitoring/Elasticsearch

06. Mapping

Mapping 은 관계형데이터베이스에서 스키마 개념과 동일하다. 
 
지금까지는 Mapping 없이 Elasticsearch에 데이터를 넣었지만,
 
Mapping 없이 데이터를 넣는것은 매우 위험하다. 
 
예를 들어 데이터에 날짜를 넣는데 그게 날짜인지 아닌지 모르며 타입형에서도 혼선이 올 수 있다. 
 
Kibana로 시각화 할때 date 타입으로 보여주고 싶어도 형이 안맞으면 적절한 출력이 안될 수도 있다.
 
따라서 데이터 관리를 위해서라도 Mapping 을 먼저 추가하는 것이
 
분석이나 시각화할때 도움이 될 수 있다.
 
 
 
 
Data Type
 
Mapping 을 하기 위해 Elasticsearch 에서 제공하는 데이터 타입을 알아보자. 
 
Elasticsearch 의 Data Type 은 크게 Core , Complex, Geo, Specialized Data Type
 
의  4가지 유형으로 나뉜다.
 
아래 소개하는 것들이 모든 데이터 타입은 아니지만 그래도 많이 사용하는 위주로 정리하였다.
 
 
 
Core Data Type
 
자주 사용되는 Data 타입으로 아래와 같은 데이터 타입이 있다.
 
 
 
Text Data Type ( text )
 
description 같은 full_text value 를 위해 사용된다.
 
 
 
 
Keyword Data Type (keyword) 
 
 
 
 
Numeric Data Types
 
 
 
Date Data Type ( date )
 
 
 
 
Boolean Data Type ( boolean )
 
 
 
 
Binary Data Type ( binary )
 
 
 
 
Range Data Type
 
 
 
 
Complex Data Type
 
Complex 데이터 타입은 기본 Core 데이터 타입보다 복잡하다.
 
 
 
Object Data Type ( object )
 
 
 
 
Array Data Type
 
Array Data Type 은 실제로는 존재 하지 않지만 Array 내부의 데이터 타입은 동일해야 하며
 
첫번째 Value 의 Data Type 이 mapping 정보에 표시가 된다.
 
 
 
 
Nested Data Type ( nested )
 
 
array 안의 object 는 어떻게 저장 될까?
 
array 안의 object field 는 우리가 생각하는 것 처럼 동작하지 않는다. 
 
예를 들어 아래와 같은 document 가 저장 되었다고 하자.
 
PUT test_index/test_type/1
{
  "group": "fans",
  "user": [
    {"first": "John", "last": "Smith"},
    {"first": "Alice", "last": "White"}
  ]
}
 
위의 요청을 받은 Elasticsearch 는 아래와 같은 형태로 Document 를 저장한다.
 
{
  "group": "fans",
  "user.first": ["alice", "john"],
  "user.last": ["smith", "white"]
}
 
저장된 문서에는 John 과 White 가 하나의 Object 였다는 사실이 없다. 
 
즉 해당 정보는 사라진 것이다. ( 수평하게 되었다고 표현한다. ) 
 
따라서 문서는 user.first: alice AND user.last: smith 의 검색 query 결과에 나타나게 되고 
 
이는 우리가 검색에서 의도한 것과는 다른 결과이다.
 
nested field 를 사용하여 array 안의 object 를 저장하자.
 
object 안에 표현된 연관 관계를 유지하기 위해서 mapping 에 user 의 type 이 nested 라고 정하자.
 
PUT test_index
{
  "mappings": {
    "test_type": {
      "properties": {
        "group": {
          "type": "keyword"
        },
        "user": {
          "type": "nested"
        }
      }
    }
  }
}
 
그런 다음 위에서 저장했던 문서를 다시 그대로 저장해 본다.
 
PUT test_index/test_type/1
{
  "group": "fans",
  "user": [
    {"first": "John", "last": "Smith"},
    {"first": "Alice", "last": "White"}
  ]
}
 
위의 요청을 받은 Elasticsearch 는 아래와 같은 형태로 Document 를 저장한다.
 
{
  "group": "fans",
  "user.first": ["alice", "john"],
  "user.last": ["smith", "white"]
}
 
 
 
Geo Data Type
 
그래픽 포인트를 나타내는 데이터 타입이다.
 
 
Geo-Point Data Type ( geo_point )
 
2 차원점을 저장하는 데이터 타입이다.
 
 
 
Geo-Shape Data Type
 
3 차원 점이나 폴리곤 서클 등을 표현하기 위한 데이터 타입이다.
 
 
 
 
Specialized Data Type
 
실생활에서 규격화된 값들을 표현하기 위한 데이터 타입이다.
 
 
IP data type ( ip )
 
 
 
 
Dynamic Mapping
 
동적 Mapping 은 Mapping 이 명시적으로 정의되지 않은 상태에서 Mapping 을 하는 것으로
 
Elasticsearch 가 자동으로 부여하는 Mapping 이다.
 
즉 처음 데이터를 넣을때 지정된 Mapping 이 존재하지 않는다면 
 
Elasticsearch 는 해당 타입을 분석하여 자동으로 Mapping 한다.
 
 
 
Mapping 이 없는 경우 동적 Mapping 이 실제로 되는지 확인해 보자.
 
 
 
 
Create Mapping
 
Mapping 은 Index 를 넣을 때 설정한다.
 
아래 두 가지 방법을 사용할 수 있다.
 
 
 
 
 
Mapping Parameter
 
type 정보 이외에도 입력된 데이터를 좀 더 쉽게 컨트롤 할수 있는 여러 속성값들을 제공하고 있다.
 
아래 내용중 주로 사용된다 하는 것들을 정리해 보았다.
 
 
 
coerce
 
type 에 따른 입력값의 자동 교정여부 설정시 사용한다.
 
 
 
copy_to
 
특정 field 에 입력값을 자동으로 복사해 넣는다.
 
 
 
dynamic
 
원래 보통은 document 에 특정 field 등을 추가하는 행위는 허용되는데
 
이 dynamic 파라미터를 사용해서 허용되지 않도록 설정할 수 있다.
 
 
 
properties
 
type 을 설정할 때 반드시 넣어줘야 하는데 
 
top level 에서 inner object 설정이 있을 때, nested 오브젝트 앞에서 사용한다.
 
 
 
null_value
 
값이 NULL 인 경우 대체할 값을 넣는다.
 
 
 
multi-fields
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

'Monitoring > Elasticsearch' 카테고리의 다른 글

08. Query  (0) 2020.01.17
07. Analyzer  (1) 2020.01.17
05. Document  (0) 2020.01.17
04. Cluster  (0) 2020.01.17
03. Install  (0) 2020.01.17