런타임 필드

원본 보기

런타임 필드

런타임 필드는 쿼리 시점에 평가되는 필드입니다. 런타임 필드를 사용하면 다음을 할 수 있습니다:

  • 데이터를 재색인하지 않고 기존 문서에 필드 추가
  • 데이터가 어떻게 구조화되어 있는지 파악하지 않고도 바로 작업 시작
  • 쿼리 시점에 색인된 필드가 반환하는 값을 재정의
  • 기반 스키마를 수정하지 않고 특정 용도의 필드 정의

런타임 필드는 다른 필드와 마찬가지로 검색 API에서 접근할 수 있으며, Elasticsearch도 런타임 필드를 다르게 취급하지 않습니다. 런타임 필드는 인덱스 매핑에서 정의하거나 검색 요청에서 정의할 수 있습니다. 어느 쪽을 선택할지는 사용자의 몫이며, 이는 런타임 필드가 본질적으로 지닌 유연성의 일부입니다.

_search API의 fields 파라미터를 사용해 런타임 필드의 값을 조회하세요. 런타임 필드는 _source에 표시되지 않지만, fields API는 원래 _source의 일부로 전송되지 않은 필드를 포함해 모든 필드에 대해 동작합니다.

런타임 필드는 로그 데이터를 다룰 때 유용하며(예제 참조), 특히 데이터 구조가 확실하지 않을 때 그렇습니다. 검색 속도는 느려지지만 인덱스 크기가 훨씬 작아지고, 로그를 색인하지 않고도 더 빠르게 처리할 수 있습니다.

런타임 필드는 색인되지 않기 때문에 런타임 필드를 추가해도 인덱스 크기가 늘어나지 않습니다. 런타임 필드는 인덱스 매핑에서 직접 정의하므로 저장 비용을 절약하고 수집 속도를 높입니다. 데이터를 Elastic Stack으로 더 빠르게 수집하고 곧바로 접근할 수 있습니다. 런타임 필드를 정의하면 검색 요청, 집계, 필터링, 정렬에 즉시 사용할 수 있습니다.

런타임 필드를 색인된 필드로 변경하더라도 해당 런타임 필드를 참조하는 쿼리를 수정할 필요가 없습니다. 더 나아가 어떤 인덱스에서는 그 필드를 런타임 필드로, 다른 인덱스에서는 색인된 필드로 참조할 수도 있습니다. 어떤 필드를 색인하고 어떤 필드를 런타임 필드로 남길지 유연하게 선택할 수 있습니다.

런타임 필드의 가장 핵심적인 이점은 문서를 수집한 뒤에 필드를 추가할 수 있다는 점입니다. 이 기능은 데이터를 어떻게 파싱할지 미리 결정하지 않아도 되고 언제든 런타임 필드로 매핑을 보완할 수 있으므로 매핑 관련 의사결정을 단순화합니다. 런타임 필드를 사용하면 인덱스가 작아지고 수집 시간이 빨라지며, 이 둘이 합쳐져 리소스 사용량과 운영 비용을 줄여 줍니다.

런타임 필드는 _search API에서 스크립팅을 활용하던 여러 방식을 대체할 수 있습니다. 런타임 필드의 사용 방식은 포함된 스크립트가 실행되는 대상 문서 수에 영향을 받습니다. 예를 들어 _search API의 fields 파라미터로 런타임 필드의 값을 조회하는 경우, 스크립트는 스크립트 필드와 마찬가지로 상위 히트에 대해서만 실행됩니다.

스크립트 필드를 사용하면 _source의 값에 접근해 스크립트 평가 결과에 기반한 계산 값을 반환할 수 있습니다. 런타임 필드도 같은 기능을 제공하지만, 검색 요청에서 런타임 필드에 대해 쿼리와 집계를 수행할 수 있어 훨씬 유연합니다. 스크립트 필드는 값을 가져오는 것만 가능합니다.

마찬가지로 스크립트를 기준으로 검색 요청의 문서를 필터링하는 스크립트 쿼리를 작성할 수도 있습니다. 런타임 필드는 이와 비슷하면서 더 유연한 기능을 제공합니다. 필드 값을 생성하는 스크립트를 작성하면 fields, 모든 쿼리, 집계 등 어디에서나 그 값을 사용할 수 있습니다.

스크립트를 사용해 검색 결과를 정렬할 수도 있는데, 동일한 스크립트가 런타임 필드에서도 똑같이 동작합니다.

검색 요청의 이러한 영역에 있던 스크립트를 동일한 수의 문서에서 값을 계산하는 런타임 필드로 옮기면 성능은 거의 같아야 합니다. 이 기능들의 성능은 대체로 포함된 스크립트가 수행하는 계산과 스크립트가 실행되는 문서 수에 따라 좌우됩니다.

런타임 필드는 디스크 공간을 적게 사용하고 데이터 접근 방식에 유연성을 제공하지만, 런타임 스크립트에 정의된 연산에 따라 검색 성능에 영향을 줄 수 있습니다.

검색 성능과 유연성의 균형을 맞추려면 타임스탬프처럼 자주 검색하고 필터링하는 필드는 색인하세요. Elasticsearch는 쿼리를 실행할 때 이런 색인된 필드를 자동으로 먼저 사용하므로 응답 시간이 빨라집니다. 그런 다음 런타임 필드를 사용해 Elasticsearch가 값을 계산해야 하는 필드 수를 제한할 수 있습니다. 색인된 필드와 런타임 필드를 함께 사용하면 색인할 데이터와 다른 필드에 대한 쿼리 정의 방식에 유연성이 생깁니다.

런타임 필드를 포함하는 검색은 비동기 검색 API로 실행하세요. 이 검색 방식은 해당 필드를 포함한 각 문서에서 런타임 필드 값을 계산할 때 발생하는 성능 영향을 상쇄하는 데 도움이 됩니다. 쿼리가 결과 집합을 동기적으로 반환할 수 없는 경우, 결과를 사용할 수 있게 되는 대로 비동기적으로 받게 됩니다.

Important

런타임 필드에 대한 쿼리는 비용이 큰 쿼리로 간주됩니다. search.allow_expensive_queriesfalse로 설정되어 있으면 비용이 큰 쿼리가 허용되지 않으며 Elasticsearch는 런타임 필드에 대한 쿼리를 모두 거부합니다.

ES|QL에서는 인덱스 매핑에 정의된 런타임 필드가 일반적인 매핑 필드처럼 동작합니다. 다만 ES|QL은 검색 시점에 새 런타임 필드를 정의하는 것을 지원하지 않습니다. 쿼리 시점에 계산 컬럼을 만들려면 대신 EVAL 명령을 사용하세요.

런타임 필드는 매핑되지 않은 필드와도 다릅니다. ES|QL이 매핑에 존재하지 않는 필드를 어떻게 처리하는지는 매핑되지 않은 필드를 참조하세요.