콘텐츠로 이동

2024 06 04

2024-06-04

Runtime Fields

참고: https://www.elastic.co/guide/en/elasticsearch/reference/7.17/runtime.html

  • 개요
    • 런타임 필드는 쿼리 타임에 평가/수행되는 필드
    • 런타임 필드를 통해
      • 재인덱싱 과정 없이, 존재하는 도큐먼트에 필드를 추가할 수 있음
      • 데이터 구조에 대한 이해 없이 데이터로 작업 시작
      • 쿼리 시점에 색인된 필드에서 반환된 값 재정의 가능
      • 기존 스키마를 수정하지 않고 특정 용도에 맞는 필드 정의
    • 데이터 구조가 확실하지 않은 로그 데이터로 작업 시, 런타임 필드가 유용함
    • 검색 속도가 조금 느려질 수 있음
  • 장점
    • 인덱스 사이즈를 늘리지 않아도 사용 가능
    • 런타임 필드를 통해 검색 요청, 집계, 필터링, 정렬에 사용 가능
    • 런타임 필드 -> 인덱싱 필드로 전환 시, 런타임 필드 참조 쿼리 수정할 필요 X
    • 데이터 수집이 완료된 시점에도 문서에 필드 추가 가능
      • 런타임 필드를 사용하면 인덱스를 작게 유지하면서 기능 제공할 수 있음
  • 인센티브
    • 런타임 필드를 통해 _search API를 사용하는 많은 방법 대체 가능
      • GET /_search 이런거
    • script fields를 통해서 _source의 값들을 가져올 수 있음
      • 스크립트 기반으로 검색 요청의 문서를 필터링하는 스크립트 쿼리 작성 가능
  • 단점
    • 런타임 필드는 디스크 공간을 덜 사용하고 데이터 액세스에 유연성을 제공하나... 검색 쿼리에 따라 검색 성능에 영향 줄 것
    • 검색 성능과 유연성의 균형을 위해서...
      • 타임스탬프 같은 자주 찾고 필터링하는 것은 인덱싱 해두세요
      • 더 빠른 response time을 제공합니다
  • 예시
    if (doc['log.keyword'].size() != 0) {
        def path = doc['log.keyword'].value;
        if (path.contains("[ReceiptStatService]")) {
            def matcher = /userId: (\d+),/.matcher(path);
            if ( matcher.find() ) {
                emit(matcher.group(1));
            }
        }
    }
    

Painless

참고: https://blog.naver.com/occidere/222102329176

  • 개요
    • ES 전용 Script 언어로, inline scripts/stored scripts에 사용
  • 특징
    • 빠른 성능
    • 높은 안정성
    • 동적 타입 지원 : int와 같은 명시타입 / def와 같은 동적 타입
    • 문법 : Java와 유사
  • 언제 쓰지?
    • 하나의 데이터 내에서 필드간 연산, 가공 등이 필요한 경우 사용