동적 필드 매핑
원본 보기동적 필드 매핑
Elasticsearch가 문서에서 새로운 필드를 감지하면 기본적으로 해당 필드를 타입 매핑에 동적으로 추가합니다. 이 동작은 dynamic 매개변수로 제어합니다.
dynamic 매개변수를 true 또는 runtime으로 설정하면 들어오는 문서를 기반으로 필드를 동적으로 생성하도록 Elasticsearch에 명시적으로 지시할 수 있습니다. 동적 필드 매핑이 활성화되면 Elasticsearch는 다음 표의 규칙에 따라 각 필드의 데이터 타입을 매핑하는 방식을 결정합니다.
다음 표에 있는 필드 데이터 타입은 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가 알 수 없는 필드를 만났을 때 문서를 거부합니다.
기존 필드의 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
date_detection을 false로 설정하면 동적 날짜 감지를 비활성화할 수 있습니다:
PUT my-index-000001
{
"mappings": {
"date_detection": false
}
}
PUT my-index-000001/_doc/1
{
"create_date": "2015/09/02"
}
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"
}
날짜 패턴을 배열로 설정하는 것과 여러 패턴을 ||로 구분해 하나의 문자열로 설정하는 것에는 차이가 있습니다. 날짜 패턴을 배열로 설정하면, 매핑되지 않은 날짜 필드를 가진 첫 번째 문서의 날짜와 일치하는 패턴이 해당 필드의 매핑을 결정합니다:
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"
}
}
}
}
}
Epoch 형식(epoch_millis 및 epoch_second)은 동적 날짜 형식으로 지원되지 않습니다.
JSON은 부동소수점과 정수 데이터 타입을 기본적으로 지원하지만, 일부 애플리케이션이나 언어는 숫자를 문자열로 표현하기도 합니다. 보통은 이러한 필드를 명시적으로 매핑하는 것이 올바른 해결책이지만, 기본적으로 비활성화되어 있는 숫자 감지를 활성화하면 이를 자동으로 처리할 수 있습니다:
PUT my-index-000001
{
"mappings": {
"numeric_detection": true
}
}
PUT my-index-000001/_doc/1
{
"my_float": "1.0",
"my_integer": "1"
}