런타임 필드 매핑

원본 보기

런타임 필드 매핑

런타임 필드는 매핑 정의 아래에 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 섹션에는 다음 데이터 타입 중 아무거나 사용할 수 있습니다:

  • boolean
  • composite
  • date
  • double
  • geo_point
  • ip
  • keyword
  • long
  • lookup

typedate인 런타임 필드는 date 필드 타입과 똑같이 format 파라미터를 받을 수 있습니다.

typelookup인 런타임 필드는 연관된 인덱스에서 필드를 조회할 수 있게 해줍니다. 연관된 인덱스에서 필드 조회하기를 참고하세요.

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으로 바뀌거나 런타임 필드가 제거되면 실패합니다.