dev? 2024. 11. 20. 16:45
반응형

Elasticsearch에서 script는 쿼리나 집계(Aggregation) 실행 시 커스텀 로직을 적용하기 위해 사용하는 기능입니다.

스크립트를 사용하면 데이터 검색, 필터링, 집계, 업데이트 등 다양한 작업을 더 동적으로 처리할 수 있습니다.


[주요 기능 및 용도]

  1. 필드 값 계산
    • 예: 특정 필드 값을 조합하거나 계산하여 검색 조건에 사용.
    • _source에서 데이터를 불러와 계산 가능.
  2. 조건부 로직 적용
    • 특정 조건에 따라 문서를 필터링하거나 결과를 조정.
    • 예: 특정 필드 값이 특정 범위 안에 있는 문서만 검색.
  3. 커스텀 점수 계산 (Scoring)
    • 기본 점수 계산 로직을 덮어쓰고 커스텀 점수를 적용.
    • 예: 특정 키워드가 포함된 문서에 높은 점수를 부여.
  4. 집계 결과 조정
    • 집계 도중 데이터를 가공하거나 커스텀 계산 수행.
    • 예: 평균, 합계 등의 집계 결과에 추가 연산 적용.
  5. 데이터 업데이트
    • Update API를 사용하여 문서의 특정 필드를 동적으로 수정.

[Script의 종류]

Elasticsearch에서는 다양한 방식으로 스크립트를 작성할 수 있습니다.

  1. Painless (기본)
    • Elasticsearch에서 기본으로 제공하는 경량 스크립트 언어.
    • 성능과 안전성을 고려하여 설계됨.
      {
        "script": {
          "source": "doc['price'].value * params.factor",
          "params": {
            "factor": 1.2
          }
        }
      }
  2. Stored Script
    • 클러스터에 사전에 저장된 스크립트를 호출하여 실행.
    • 반복적으로 사용해야 하거나 복잡한 로직에 적합.
  3. Inline Script
    • 스크립트를 쿼리 안에 직접 작성.
    • 간단한 계산이나 로직에 유용.
  4. Native Script (Deprecated)
    • Java로 작성된 커스텀 스크립트. 현재는 잘 사용되지 않음.

[예시]

1) 전체 문서 검색 및 커스텀 점수 계산

POST /인덱스명/_search
POST /my_index/_search
{
  "query" : {
    "function_score": {
      "query": {
        "match_all": {}
      },
      "script_score": {
        "script":{
          "source": "doc['price'].value * _score"
        }
      }
    }
  }
}
  • 모든 문서를 검색 (match_all)합니다.
  • 각 문서의 _score(기본 점수)에 price 필드 값을 곱하여 커스텀 점수를 계산합니다.

 

2) 집계: 커스텀 평균 계산

POST /인덱스명/_search
POST /my_index/_search
{
  "size" : 0,
  "aggs": {
    "custom_avg": {
      "avg": {
        "script": {
          "source": "doc['price'].value * params.vat_rate",
          "params": {
            "vat_rate":1.2
          }
        }
      }
    }
  }
}
  • 검색 결과는 반환하지 않고(size: 0), 집계 결과만 반환합니다.
  • price 필드 값에 vat_rate(부가세율 1.2)를 곱한 값을 기준으로 평균을 계산합니다.

 

3) 스크립트 등록

POST /_scripts/저장할 이름
POST /_scripts/calculate-vat
{
  "script":{
    "lang" : "painless",
    "source": "doc['price'].value * params.vat_rate"
  }
}
  • 서버에 calculate-vat라는 ID로 Painless 스크립트를 저장합니다.
  • 이 스크립트는 price 값에 vat_rate를 곱하는 로직을 수행합니다.
  • 등록된 스크립트는 다른 쿼리에서 재사용 가능합니다.

 

4) 등록된 스크립트를 활용한 집계

POST /인덱스명/_search
POST /my_index/_search
{
  "size": 0,
  "aggs": {
    "custom_avg": {
      "avg": {
        "script": {
          "id":"calculate-vat",
          "params": {
            "vat_rate":1.2
          }
        }
      }
    }
  }
}
  • 앞서 등록한 calculate-vat 스크립트를 사용하여 집계를 수행합니다.
  • price 값에 vat_rate를 곱한 결과의 평균을 계산합니다.
  • 등록된 스크립트를 활용하므로 스크립트를 재작성할 필요가 없습니다.
반응형