동적 필드 매핑

원본 보기

동적 필드 매핑

Elasticsearch가 문서에서 새로운 필드를 감지하면 기본적으로 해당 필드를 타입 매핑에 동적으로 추가합니다. 이 동작은 dynamic 매개변수로 제어합니다.

dynamic 매개변수를 true 또는 runtime으로 설정하면 들어오는 문서를 기반으로 필드를 동적으로 생성하도록 Elasticsearch에 명시적으로 지시할 수 있습니다. 동적 필드 매핑이 활성화되면 Elasticsearch는 다음 표의 규칙에 따라 각 필드의 데이터 타입을 매핑하는 방식을 결정합니다.

Note

다음 표에 있는 필드 데이터 타입은 Elasticsearch가 동적으로 감지하는 유일한 필드 데이터 타입입니다. 그 외의 모든 데이터 타입은 명시적으로 매핑해야 합니다.

JSON 데이터 타입 Elasticsearch 데이터 타입
("dynamic":"true")
Elasticsearch 데이터 타입
("dynamic":"runtime")
null 필드가 추가되지 않음 필드가 추가되지 않음
true 또는 false boolean boolean
double float double
long long long
object object 필드가 추가되지 않음
array 배열에서 null이 아닌 첫 번째 값에 따라 결정됨 배열에서 null이 아닌 첫 번째 값에 따라 결정됨
날짜 감지를 통과하는 string date date
숫자 감지를 통과하는 string float 또는 long double 또는 long
date 감지나 numeric 감지를 통과하지 못하는 string .keyword 하위 필드를 가진 text keyword

동적 매핑은 문서 수준과 object 수준 모두에서 비활성화할 수 있습니다. dynamic 매개변수를 false로 설정하면 새 필드를 무시하고, strict로 설정하면 Elasticsearch가 알 수 없는 필드를 만났을 때 문서를 거부합니다.

Tip

기존 필드의 dynamic 설정을 변경하려면 update mapping API를 사용하세요.

날짜 감지숫자 감지에 대해 동적 필드 매핑 규칙을 커스터마이즈할 수 있습니다. 추가적인 동적 필드에 적용할 사용자 정의 매핑 규칙을 정의하려면 dynamic_templates를 사용하세요.

date_detection이 활성화되어 있으면(기본값) 새로운 문자열 필드의 내용이 dynamic_date_formats에 지정된 날짜 패턴 중 하나와 일치하는지 검사합니다. 일치하는 패턴이 있으면 해당 형식을 가진 새 date 필드가 추가됩니다.

dynamic_date_formats의 기본값은 다음과 같습니다:

[ "strict_date_optional_time","yyyy/MM/dd HH:mm:ss Z||yyyy/MM/dd Z"]

예를 들면:

				PUT my-index-000001/_doc/1
					{
  "create_date": "2015/09/02"
}
				GET my-index-000001/_mapping
		
  1. create_date 필드가 다음 format을 가진 date 필드로 추가되었습니다:
    "yyyy/MM/dd HH:mm:ss Z||yyyy/MM/dd Z".

date_detectionfalse로 설정하면 동적 날짜 감지를 비활성화할 수 있습니다:

				PUT my-index-000001
					{
  "mappings": {
    "date_detection": false
  }
}
				PUT my-index-000001/_doc/1
					{
  "create_date": "2015/09/02"
}
		
  1. create_date 필드가 text 필드로 추가되었습니다.

또는 dynamic_date_formats를 커스터마이즈하여 원하는 날짜 형식을 지원하도록 할 수 있습니다:

				PUT my-index-000001
					{
  "mappings": {
    "dynamic_date_formats": ["MM/dd/yyyy"]
  }
}
				PUT my-index-000001/_doc/1
					{
  "create_date": "09/25/2015"
}
		
Note

날짜 패턴을 배열로 설정하는 것과 여러 패턴을 ||로 구분해 하나의 문자열로 설정하는 것에는 차이가 있습니다. 날짜 패턴을 배열로 설정하면, 매핑되지 않은 날짜 필드를 가진 첫 번째 문서의 날짜와 일치하는 패턴이 해당 필드의 매핑을 결정합니다:

				PUT my-index-000001
					{
  "mappings": {
    "dynamic_date_formats": [ "yyyy/MM", "MM/dd/yyyy"]
  }
}
				PUT my-index-000001/_doc/1
					{
  "create_date": "09/25/2015"
}
		

결과 매핑은 다음과 같습니다:

{
  "my-index-000001": {
    "mappings": {
      "dynamic_date_formats": [
        "yyyy/MM",
        "MM/dd/yyyy"
      ],
      "properties": {
        "create_date": {
          "type": "date",
          "format": "MM/dd/yyyy"
        }
      }
    }
  }
}
		

여러 패턴을 ||로 구분해 하나의 문자열로 설정하면 해당 날짜 형식 중 어느 것이든 지원하는 매핑이 만들어집니다. 이를 통해 서로 다른 형식을 사용하는 문서를 색인할 수 있습니다:

				PUT my-index-000001
					{
  "mappings": {
    "dynamic_date_formats": [ "yyyy/MM||MM/dd/yyyy"]
  }
}
				PUT my-index-000001/_doc/1
					{
  "create_date": "09/25/2015"
}
		

결과 매핑은 다음과 같습니다:

{
  "my-index-000001": {
    "mappings": {
      "dynamic_date_formats": [
        "yyyy/MM||MM/dd/yyyy"
      ],
      "properties": {
        "create_date": {
          "type": "date",
          "format": "yyyy/MM||MM/dd/yyyy"
        }
      }
    }
  }
}
		
Note

Epoch 형식(epoch_millisepoch_second)은 동적 날짜 형식으로 지원되지 않습니다.

JSON은 부동소수점과 정수 데이터 타입을 기본적으로 지원하지만, 일부 애플리케이션이나 언어는 숫자를 문자열로 표현하기도 합니다. 보통은 이러한 필드를 명시적으로 매핑하는 것이 올바른 해결책이지만, 기본적으로 비활성화되어 있는 숫자 감지를 활성화하면 이를 자동으로 처리할 수 있습니다:

				PUT my-index-000001
					{
  "mappings": {
    "numeric_detection": true
  }
}
				PUT my-index-000001/_doc/1
					{
  "my_float":   "1.0",
  "my_integer": "1"
}
		
  1. my_float 필드가 float 필드로 추가되었습니다.
  2. my_integer 필드가 long 필드로 추가되었습니다.