728x90
엘라스틱서치는 스크립트를 이용해 사용자가 특정 로직을 삽입하는 것이 가능하다.(스크립팅)
스크립팅을 이용하면, 검색 요청 시 특정 필드를 선택적으로 반환하거나, 필드의 특정 요소를 수정하는 등 광범위한 작업을 할 수 있다.
최신 엘라스틱서치에서는 스크립팅 전용 언어인 페인리스(Painless)가 도입되어 전문적인 스크립트 작성이 가능해졌다.
업데이트 API 같은 경우가 내부적으로 스크립팅을 사용하는 것으로 업데이트할 로직을 스크립트로 직접 정의하고 이를 통해 문서의 업데이트가 이뤄지는 것이다.
스크립팅을 사용하는 방법
1. config 폴더에 스크립팅을 저장하는 방식: 스크립트 파일을 config 폴더에 저장한 후, 이름을 지정해 코드에서 호출
2. in-requests 방식: 동적 스크립팅으로 API를 호출할 때 코드 내에서 스크립트를 직접 정의
동적 스크립팅 방식을 사용하려면 elasticsearch.yml에 script.disable_dynamic: false 설정을 해야 한다.
필드 추가
Request
POST movie_script/_doc/1/_update
{
"script": {
"source": "ctx._source.movieList.Black_Panther = 3.7"
}
}
Response
{
"_index": "movie_script", // 업데이트된 문서가 속한 인덱스 이름
"_type": "_doc", // 문서 타입 (7.x 이후엔 항상 "_doc")
"_id": "1", // 업데이트된 문서의 ID
"_version": 2, // 문서 버전 (수정될 때마다 +1)
"result": "updated", // 수행 결과 → "updated" = 기존 문서 수정됨
"_shards": {
"total": 2, // 요청이 전달된 샤드 개수
"successful": 2, // 성공적으로 처리된 샤드 수
"failed": 0 // 실패한 샤드 수
},
"_seq_no": 1, // 샤드 내 시퀀스 번호 (낙관적 동시성 제어용)
"_primary_term": 1 // 프라이머리 샤드 term (리더 교체 시 증가)
}
- _updateAPI(내부적으로 스크립팅 동작) 이용하여, script를 통한 Black_Panther 평점을 3.7로 수정했다.
- 추가할 필드를 ctx._source.movieList.Black_Panther와 같은 형식으로 지정해야 한다.
- prefix로 지정한 ctx._source는 스크립트에서 제공하는 특수 문법으로 색인된 문서에 접근하기 위한 문법이다.
필드 제거
Request
POST movie_script/_doc/1/_update
{
"script": "ctx._source.movieList.remove(\"Suits\")"
}
Response
GET movie_script/_doc/_search
{
"hits": {
"total": 1,
"max_score": 1.0,
"hits": [
{
"_index": "movie_script",
"_type": "_doc",
"_id": "1",
"_score": 1.0,
"_source": {
"movieList": {
"Death_Wish": 5.5,
"About_Time": 7,
"Black_Panther": 3.7
}
}
}
]
}
}
- 기존 필드를 제거하는 것도 스크립트를 이용해 ctx._source.remove('fieldName') 제거하면 된다.
728x90
'Elastic Search' 카테고리의 다른 글
| Ch06. 고급 검색 - 별칭을 이용해 항상 최신 인덱스 유지하기 (0) | 2025.09.24 |
|---|---|
| Ch06. 고급 검색 - 검색 템플릿을 이용한 동적 쿼리 제공 (0) | 2025.09.24 |
| Ch06. 고급 검색 - 검색 결과 하이라이트하기 (0) | 2025.09.24 |
| Ch06. 고급 검색 - 한글 형태소 분석기 사용하기 (0) | 2025.09.24 |
| Ch05. 데이터 집계 - 근사값으로 제공되는 집계 연산 (0) | 2025.09.18 |