본문 바로가기
DataBase

[Elastic Search] Scripting & Runtime Fields

by HANdeveloper 2024. 1. 6.

✅ Scripting ?

 - 데이터가 들어와서 넣었는데 가공이 되지 않았을 경우 기존 데이터를 이용해서 다르게 보여주고 싶을 때 사용

 - e.g ) 남/여로 카테고리를 보고 싶은데 1,2로 데이터가 들어왔을 때 간단하게 1은 남, 2는 여로 지정

 

✅ Script field 구조

<< request >>

GET blogs_fixed2/_search 
{
  "script_fields": { // 스크립트 필드를 정의하는 섹션
    "second_part_of_url": { // 새로운 스크립트 필드 이름 (내가 정하면 되는 이름)
       "script": { // 하위에 스크립트를 정의함
          "source": "doc['url'].value.splitOnToken('/')[2]" //스크립트 내용 지정
          "lang" : "painless" // 사용할 스크립트 언어 지정
           }
        }
    },
    "aggs": { // 생략가능
      "test": {
         "terms": {
           "field": "my_doubled_field",
           "size": 10
    
...

- 위에서는 second_part_of_url 이라는 필드 이름을 정하여 해당 필드는 script.source 에 있는 내용이 들어가게 됨

 

<< response >> ⭐️ 통계 호출 불가능

⚠️주의

 - script field는 결과의 내용을 재사용 할 수 없음

 - 다른 내용을 같이 확인할 수 없음 (검색한 필드만 출력됨 _ 위 이미지 참고)

 

✅ Runtime Fields ?

 - 색인 시에 데이터를 변환하거나 추가적인 계산을 수행하여 동적으로 새로운 필드를 생성하는 기능

 

✅ runtime fields mapping => mapping 에 runtime field 를 넣는 개념

PUT blogs/_mapping
{
   "runtime": { 
       "day_of_week": { //day_of_week 을 runtime field로 정의
           "type": "keyword",
           "script": {
              "source": "emit(doc['publish_date'].value.dayOfWeekEnum.getDisplayName(TextStyle.FULL, Locale.ROOT))" 
             }
...

 - 현재는 날짜 밖에 받아오지 못해 runtime field 통해 가져옴 -> 기존 날짜값을 가져와서 숫자를 받아 요일로 변환해주는 함수 사용

 - ⭐️runtime field 일때만 emit() 을 필수적으로 사용함!

 

✅ searching runtime field

GET blogs/_search
{
    "query" : {
        "match" : {
             "day_of_week" : "Monday"
        }
    }
}

 - 매핑에서 runtime field안에 day_of_week을 지정해놨기 때문에 해당 필드 검색이 가능해짐

 

✅ runtime fields in a search request => 검색 시에만 해당 필드를 생성하도록 함 / 쿼리 날릴 때만 사용하므로 매핑보다 훨씬 가벼움

<< request >>

GET blogs/_search //검색으로 날림
{
    "runtime_mappings": { // 런타임 필드 매핑
        "day_of_week": { //해당 필드 생성
            "type": "keyword", 
            "script": {
                "source": "emit(doc['@timestamp'].value.dayOfWeekEnum.getDisplayName(TextStyle.FULL, Locale.ROOT))" 
            }
		} 
	},
    "aggs": { // 통계 검색
        "my_agg": {
            "terms": {
                "field": "day_of_week"
...

<< response >> ⭐️ 통계 호출 가능

⚠️ script field 와의 차이점

- 결과의 내용을 재사용할 수 있음

- 다른 내용과 같이 확인이 가능

- 쿼리로 날리는 것 외에도 인덱스 mapping 에 입력해서 사용 가능

- 통계에 사용 가능

- 쿼리한 source 를 재사용하려는 경우에는 아래와 같이 내용 검색하면 됨

"fields": [
  "day_of_week"
],

 

🔔 결론 정리 🔔 

처음 인덱스 생성 시 내가 원하는 필드를 생성하지 못하였을 때
해당 필드&값이 필요한 경우 script field || runtime field를 사용함! -> 하지만 속도저하 이슈가 있으므로 지양하는 편

댓글