반응형

 

매핑

색인 시 데이터가 어디에 어떻게 저장될지를 결정하는 설정이다.

데이터베이스의 스키마에 대응하는 개념이라고도 할 수 있고 인덱스에 추가되는 각 데이터 타입을 구체적으로 정의하는 일이다.

엘라스틱서치는 기본적으로 스키마리스이기 때문에 명시적으로 필드를 정의하지 않아도 데이터 유형에 따라 필드 데이터 타입에 대한 매핑 정보가 자동으로 생성된다.

이러한 자동 매핑방식이 편리해 보이지만 실수로 잘못된 타입이 지정될 경우 수정할 방법이 없기 때문에 주의해야한다.

 

아래에서 매핑 인덱스 생성과 필드 데이터 타입을 함께 알아보겠습니다.

 

필드 데이터 타입

# keyword, text 같은 문자열 데이터 타입

# date, long, double, integer, boolean, ip 같은 일반적인 데이터 타입

# 객체 또는 중첩문과 같은 JSON 계층의 특성의 데이터 타입

# geo_point, geo_shape 같은 특수한 데이터 타입

 

# Keyword

키워드 형태로 사용할 데이터에 적합한 데이터 타입.

검색 시 필터링되는 항목 , 정렬이 필요한 항목, 집계 해야하는 항목 에 많이 사용된다.

별도의 분석기를 거치지 않고 원문 그대로 색인하기 때문에 특정 코드나 키워드 등 정형화된 컨텐츠에 주로 사용된다.

만약 elastic search 라는 문자열이 keyword 타입으로 설정되면 elastic이나 search라는 질의로는 절대 검색되지 않는다.

정확히 elastic search라고 질의해야함.

 

1
2
3
4
5
6
7
8
PUT movie_search/_mapping/_doc
{
  "properties" : {
    "multiMovieYn" : {
      "type" : "keyword"
    }
  }
}
cs

# Text

색인 시 지정된 분석기가 컬럼의 데이터를 문자열 데이터로 인식하고 이를 분석한다.

Text 타입으로 데이터를 색인하면 전체 텍스트가 토큰화되어 생성되며 특정 단어를 검색하는 것이 가능해진다.

 

1
2
3
4
5
6
7
8
PUT movie_search/_mapping/_doc
{
  "properties" : {
    "movieComment" : {
      "type" : "text"
    }
  }
}
cs

# Array

영화 데이터에 subtitleLang 필드가 있고 해당 필드에는 개봉 영화의 언어 코드 데이터가 들어있다고 가정해보자.

언어의 값으로 영어(en)와 한국어(ko)라는 두 개의 데이터를 입력하고 싶을 경우 Array 데이터 타입을 사용해야 한다.

문자열이나 숫자처럼 일반적인 값을 지정할 수도 있지만 객체 형태로도 정의할 수 있다.

Array 타입에 저장되는 값은 모두 같은 타입으로만 구성해야 한다.

 

1
2
3
4
5
PUT movie_search/_doc/1
{
 "title" : "해리포터와 마법사의 돌",
 "subtitleLang" : ["ko", "en"]
}
cs

# Numeric 

색인과 검색을 효율적으로 처리하기위한 데이터의 크기에 알맞은 다양한 타입이 제공된다.

long 최솟값과 최댓값을 가지는 부호 있는 64비트 정수. -2^63 ~ 2^63-1
integer 최솟값과 최댓값을 가지는 부호 있는 32비트 정수. -2^31 ~ 2^31-1
short 최솟값과 최댓값을 가지는 부호 있는 16비트 정수. -32768 ~ 32767
byte 최솟값과 최댓값을 가지는 부호 있는 8비트 정수. -128 ~ 127
double 64비트 부동 소수점을 갖는 수
float 32비트 부동 소수점을 갖는 수
half_float 16비트 부동 소수점을 갖는 수

 

 

# Date

Date 타입은 JSON 포맷에서 문자열로 처리된다.

날짜는 다양하게 표현될 수 있기 때문에 올바르게 구문 분석될 수 있게 날짜 문자열 형식을 명시적으로 설정해야한다.

별도의 형식을 지정하지 않을 경우 기본 형식인 “yyyy-MM-ddTHH:mm:ssZ”로 지정된다.

 

1
2
3
4
5
6
7
8
PUT movie_search/_mapping/_doc
{
 "properties" : {
   "date" : {
     "type" : "date", "format" : "yyyy-MM-dd HH:mm:ss"
   }
 }
}
cs

# Range 

범위가 있는 데이터를 저장할 때 사용하는 데이터 타입이다.

데이터의 시작과 끝만 지정한다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
PUT movie_search/_mapping/_doc
{
  "properties" : {
    "showRange" : {
      "type" : "date_range"
    }
  }
}
 
PUT movie_search/_doc/2
{
  "showRange" : {
    "gte" : "2001-01-01",
    "lte" : "2001-12-31"
  }
}
cs

 

# Boolean

 

1
2
3
4
5
6
7
8
PUT movie_search/_mapping/_doc
{
  "properties" : {
    "check" : {
      "type" : "boolean"
    }
  }
}
cs

 

# Geo-Point 

위도, 경도 등 위치 정보를 담은 데이터를 저장할 때 사용할 수 있는 타입이다.

위치기반 데이터를 색인하고 검색하는 데 매우 유용하다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
PUT movie_search/_mapping/_doc
{
  "properties" : {
    "filmLocation" : {
      "type" : "geo_point"
    }
  }
}
 
PUT movie_search/_doc/3
{
  "title" : "해리포터와 마법사의 돌",
  "filmLocation" : {
    "lat" : 55.415555,
    "lon" : -1.3333
  }
}
cs

# IP

IP 주소와 같은 데이터를 저장하는 데 사용한다. IPv4IPv6를 모두 지정 가능.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
PUT movie_search/_mapping/_doc
{
  "properties" : {
    "ipAddr" : {
      "type" : "ip"
    }
  }
}
 
PUT movie_search/_doc/4
{
  "ipAddr" : "127.0.0.1"
}
cs

# Object

JSON 포맷의 문서는 내부 객체를 계층적으로 포함할 수 있다.

문서의 필드는 단순히 값을 가질 수도 있지만 복잡한 형태의 또 다른 문서를 포함하는 것도 가능하다.

이처럼 값으로 문서를 가지는 필드의 데이터 타입을 Object 데이터 타입이라고 한다.

Object 데이터 타입을 정의할 때는 다른 데이터 타입과 같이 특정 키워드를 이용하지 않고 단지 필드값으로 다른 문서의 구조를 입력한다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
PUT movie_search/_mapping/_doc
{
  "properties" : {
    "companies" : {
      "properties" : {
        "companyName" : {
          "type" : "text"
        }
      }
    }
  }
}
 
PUT movie_search/_doc/5
{
  "title" : "반지의 제왕",
  "companies" : {
    "companyName" : "워너브라더스"
  }
}
cs

# Nested

Object 객체 배열을 독립적으로 색인하고 질의하는 형태의 데이터 타입이다.

필드에 객체가 배열 형태로 저장 가능하다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#인덱스 생성
PUT movie_search/_mapping/_doc
{
  "properties" : {
    "companies_nested" : {
      "type" : "nested"
    }
  }
}
 
#데이터 색인
PUT movie_search/_doc/8
{
  "title" : "해리포터와 마법사의 돌",
  "companies_nested" : [
    {
      "companyCd" : "1",
      "companyName" : "워너브라더스"
    },{
      "companyCd" : "2",
      "companyName" : "Hello films"
    }
    ]
}
#검색
POST movie_search/_search
{
  "query": {
    "nested": {
      "path": "companies_nested",
      "query": {
        "bool": {
          "must": [
            {
              "match": {
                "companies_nested.companyName": "워너브라더스"}
              },
              {
                "match" : {
                  "companies_nested.companyCd" : "1"
                }
              }
          ]
        }
      }
    }
  }
}
cs

참고서적 권택환 외 5명 「엘라스틱서치 실무 가이드」 위키북스(2019) p61~97

+ Recent posts