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 |