Elastic Search

ES - Runtime field

miin1635@ 2023. 10. 17. 11:27

E.S에서 runtime field란, 임시의 필드를 생성해주는 것이다. 이 런타임 필드는 인덱스의 크기를 늘리지 않는다. 그래서 인덱싱을 했을 때, mapping을 잘못해주었을 경우,혹은 하나의 필드를 다른 타입으로도 활용하고 싶을 때 사용한다. 또한 런타임 필드를 이용해서 각 필드의 value를 활용해 연산 또한 할 수 있다 ( doc['fieldname'].value , emit). 

런타임 필드를 맵핑할 때 , 기존에 존재하는 필드의 이름과 동일하게 한다면 런타임 필드는 숨겨진다.

 

*스크립트를 짰을 때,  그 오퍼레이션에 맞는 데이터 타입의 필드를 사용해야한다.*

 

1. 서치로 바로 runtime_mappings을 생성
GET ds_admin_minsu_test/_search
{
  "runtime_mappings": {
    "calcul": {
      "type": "double",
      "script": {
        "source": 
        """
        if (doc['weeight'].value == (2222))
        {emit(2 * params._source['weeight']);}
        else{emit(2.9 * params._source['weeight']);} 
        """
      }
    }
  },
  "query": {
    "match": {
      "field_name": "yum"
    }
  },
  "fields": [
    "calcul"
  ]
}

 

결과 값 : 

정상적으로 작동 (원래는 'weeight'의 필드 값이 2222 (type=long) 이였다. 

 

 

2. 인덱스에 runtime Mapping을 넣은 다음, 그 내용을 검색

*runtime mapping은 일반 search 문에서는 검색되지 않으므로, 런타임 필드를 특정해서 검색해야지 나온다. 

(마치 데이터를 ingest 하는 것 과 같다.) 

 

PUT my-index-000001/_mapping
{
  "runtime": {
    "voltage_corrected": {
      "type": "double",
      "script": {
        "source": """
        emit(doc['voltage'].value * params['multiplier'])
        """,
        "params": {
          "multiplier": 2
        }
      }
    }
  }
}


GET my-index-000001/_search
{
  "fields": [
    "voltage_corrected",
    "node"
  ],
  "size": 2
}