런타임 필드 매핑
원본 보기런타임 필드 매핑
런타임 필드는 매핑 정의 아래에 runtime 섹션을 추가하고 Painless 스크립트를 정의해서 매핑합니다. 이 스크립트는 params._source를 통한 원본 _source와 매핑된 모든 필드 및 그 값을 포함해 문서의 전체 컨텍스트에 접근할 수 있습니다. 쿼리 시점에 스크립트가 실행되어 쿼리에 필요한 각 스크립트 필드의 값을 생성합니다.
런타임 필드에 사용할 Painless 스크립트를 정의할 때는 계산된 값을 방출하기 위해 emit 메서드를 포함해야 합니다.
예를 들어 다음 요청의 스크립트는 date 타입으로 정의된 @timestamp 필드에서 요일을 계산합니다. 스크립트는 timestamp의 값을 기준으로 요일을 계산하고, emit을 사용해 계산된 값을 반환합니다.
PUT my-index-000001/
{
"mappings": {
"runtime": {
"day_of_week": {
"type": "keyword",
"script": {
"source": "emit(doc['@timestamp'].value.dayOfWeekEnum.getDisplayName(TextStyle.FULL, Locale.ENGLISH))"
}
}
},
"properties": {
"@timestamp": {"type": "date"}
}
}
}
runtime 섹션에는 다음 데이터 타입 중 아무거나 사용할 수 있습니다:
booleancompositedatedoublegeo_pointipkeywordlonglookup
type이 date인 런타임 필드는 date 필드 타입과 똑같이 format 파라미터를 받을 수 있습니다.
type이 lookup인 런타임 필드는 연관된 인덱스에서 필드를 조회할 수 있게 해줍니다. 연관된 인덱스에서 필드 조회하기를 참고하세요.
dynamic 파라미터가 runtime으로 설정되어 동적 필드 매핑이 활성화되어 있으면, 새 필드가 런타임 필드로 인덱스 매핑에 자동으로 추가됩니다:
PUT my-index-000001
{
"mappings": {
"dynamic": "runtime",
"properties": {
"@timestamp": {
"type": "date"
}
}
}
}
런타임 필드는 보통 데이터를 어떤 식으로든 조작하는 Painless 스크립트를 포함합니다. 하지만 스크립트 없이 런타임 필드를 정의하는 경우도 있습니다. 예를 들어 _source에서 변경 없이 단일 필드를 가져오려는 경우에는 스크립트가 필요 없습니다. day_of_week처럼 스크립트 없이 런타임 필드를 만들면 됩니다:
PUT my-index-000001/
{
"mappings": {
"runtime": {
"day_of_week": {
"type": "keyword"
}
}
}
}
스크립트를 제공하지 않으면 Elasticsearch는 쿼리 시점에 _source에서 런타임 필드와 같은 이름의 필드를 암묵적으로 찾고, 존재하면 그 값을 반환합니다. 같은 이름의 필드가 없으면 응답에 해당 런타임 필드의 값이 포함되지 않습니다.
대부분의 경우 가능하면 doc_values를 통해 필드 값을 가져오세요. Lucene에서 데이터를 읽어오는 방식 때문에, 런타임 필드에서 doc_values에 접근하는 것이 _source에서 값을 가져오는 것보다 빠릅니다.
다만 _source에서 필드를 가져와야 하는 경우도 있습니다. 예를 들어 text 필드는 기본적으로 doc_values를 사용할 수 없으므로 _source에서 값을 가져와야 합니다. 또 특정 필드에서 doc_values를 비활성화하기로 선택하는 경우도 있습니다.
대안으로 값을 가져올 필드 앞에 params._source를 붙일 수도 있습니다(예: params._source.day_of_week). 단순함을 위해, 가능하면 매핑 정의에서 스크립트 없이 런타임 필드를 정의하는 방식을 권장합니다.
스크립트는 실행 중에 오류를 던질 수 있습니다. 예를 들어 문서에서 없거나 잘못된 값에 접근할 때, 또는 잘못된 연산을 수행할 때 그렇습니다. 이런 경우의 오류 동작은 on_script_error 파라미터로 제어할 수 있습니다. 이 파라미터를 continue로 설정하면 해당 런타임 필드의 모든 오류를 조용히 무시하는 효과가 있습니다. 기본값인 fail은 샤드 실패를 발생시키며, 이는 검색 응답에 보고됩니다.
런타임 필드는 언제든지 수정하거나 제거할 수 있습니다. 기존 런타임 필드를 교체하려면 같은 이름의 새 런타임 필드를 매핑에 추가하세요. 매핑에서 런타임 필드를 제거하려면 해당 런타임 필드의 값을 null로 설정하세요:
PUT my-index-000001/_mapping
{
"runtime": {
"day_of_week": null
}
}
의존하는 쿼리가 실행 중인 상태에서 런타임 필드를 수정하거나 제거하면 일관되지 않은 결과가 반환될 수 있습니다. 매핑 변경이 적용되는 시점에 따라 각 샤드가 서로 다른 버전의 스크립트에 접근할 수 있습니다.
런타임 필드에 의존하는 Kibana의 기존 쿼리나 시각화는 해당 필드를 제거하거나 수정하면 실패할 수 있습니다. 예를 들어 ip 타입의 런타임 필드를 사용하는 막대 차트 시각화는 타입이 boolean으로 바뀌거나 런타임 필드가 제거되면 실패합니다.