쿼리로 일괄 업데이트 API
쿼리로 일괄 업데이트 API (Update By Query API)
1.0에서 도입되었어요. Update by Query API는 지정한 쿼리와 일치하는 인덱스의 모든 문서를 업데이트해요. 매핑 변경을 반영하려고 소스를 바꾸지 않고 문서를 업데이트할 수도 있고, 사용자 지정 로직에 따라 필드 값을 수정하는 스크립트를 사용할 수도 있어요.
이 API는 다음과 같은 상황에서 사용해요.
- 새 필드를 추가하거나 필드 타입을 변경한 후 기존 문서에 매핑 변경을 적용할 때
- 계산된 로직이나 조건에 따라 여러 문서의 필드 값을 업데이트할 때
- 특정 기준과 일치하는 문서에 대해 카운터를 증가시키거나 일괄 계산을 수행할 때
- 스크립트에서
ctx.op = "delete"를 설정해 조건부로 문서를 삭제할 때 - 조건이 충족되지 않을 때
ctx.op = "noop"를 설정해 아무 작업도 수행하지 않는 업데이트를 할 때
update by query 요청을 제출하면 OpenSearch는 작업 시작 시점에 인덱스의 스냅샷을 찍고 내부 버전 관리(internal versioning)로 일치하는 문서를 업데이트해요. 스냅샷을 찍은 시점과 업데이트 작업이 해당 문서를 처리하는 시점 사이에 문서가 변경되면 버전 충돌이 발생하고, conflicts 파라미터를 proceed로 설정하지 않는 한 그 문서의 업데이트는 실패해요. 버전 충돌이 중단(abort)을 유발하지 않으면 문서가 업데이트되고 버전 번호가 증가해요. 성공적으로 업데이트된 문서는 나중에 배치의 다른 작업이 실패하더라도 롤백되지 않아요.
모든 업데이트·쿼리 실패는 작업을 중단시키고 응답의 failures 배열에 반환돼요. 성공한 업데이트는 중단 후에도 유지돼요. 첫 번째 실패가 중단을 유발하지만, 거부된 bulk 요청의 모든 실패가 failures 요소에 나타나므로 여러 실패 엔티티가 보고될 수 있어요.
OpenSearch는 거부된 search 또는 bulk 요청을 지수 백오프(exponential backoff)로 최대 10번까지 재시도해요. 최대 재시도 한도에 도달하면 작업이 멈추고 모든 실패 요청을 응답에 반환해요.
참고: OpenSearch는 이 API로 버전 0인 문서를 업데이트할 수 없어요. 내부 버전 관리 시스템은 업데이트 작업을 올바르게 추적하고 처리하려면 버전 번호가 0보다 커야 해요.
출처: 문서
본문
엔드포인트 (Endpoints)
POST /{index}/_update_by_query
경로 파라미터 (Path parameters)
다음 표는 사용 가능한 경로 파라미터를 보여줘요.
| 파라미터 | 필수 | 데이터 타입 | 설명 |
|---|---|---|---|
| index | 필수 | List 또는 String | 검색할 데이터 스트림, 인덱스, 별칭의 쉼표 구분 목록이에요. 와일드카드(*)를 지원해요. 모든 데이터 스트림이나 인덱스를 검색하려면 이 파라미터를 생략하거나 * 또는 _all을 사용해요. |
쿼리 파라미터 (Query parameters)
다음 표는 사용 가능한 쿼리 파라미터를 보여줘요. 모든 쿼리 파라미터는 선택 사항이에요.
| 파라미터 | 데이터 타입 | 설명 | 기본값 |
|---|---|---|---|
| _source | Boolean 또는 List 또는 String | _source 필드를 반환할지 말지 true 또는 false로 설정하거나, 반환할 필드 목록으로 설정해요. |
N/A |
| _source_excludes | List | 반환되는 _source 필드에서 제외할 필드 목록이에요. |
N/A |
| _source_includes | List | _source 필드에서 추출해서 반환할 필드 목록이에요. |
N/A |
| allow_no_indices | Boolean | false이면 어떤 와일드카드 표현, 인덱스 별칭, _all 값이 없거나 닫힌 인덱스만 대상으로 할 때 요청이 오류를 반환해요. 요청이 다른 열린 인덱스를 대상으로 하더라도 이 동작이 적용돼요. 예를 들어 foo*,bar*를 대상으로 하는 요청에서 foo로 시작하는 인덱스는 있지만 bar로 시작하는 인덱스가 없으면 오류를 반환해요. |
N/A |
| analyze_wildcard | Boolean | true이면 와일드카드와 접두사 쿼리가 분석돼요. |
false |
| analyzer | String | 쿼리 문자열에 사용할 분석기예요. | N/A |
| conflicts | String | update by query가 버전 충돌에 부딪히면 어떻게 할지: abort 또는 proceed. 유효한 값은 다음과 같아요. - abort : 버전 충돌 시 작업을 중단해요. - proceed : 버전 충돌에도 작업을 계속해요. |
N/A |
| default_operator | String | 쿼리 문자열 쿼리의 기본 연산자: AND 또는 OR. 유효한 값은 and, AND, or, OR예요. |
N/A |
| df | String | 쿼리 문자열에 필드 접두사가 없을 때 기본으로 사용할 필드예요. | N/A |
| expand_wildcards | List 또는 String | 와일드카드 패턴이 일치할 수 있는 인덱스 유형이에요. 요청이 데이터 스트림을 대상으로 할 수 있다면, 이 인자는 와일드카드 표현이 숨겨진 데이터 스트림과 일치하는지 결정해요. open,hidden처럼 쉼표로 구분된 값을 지원해요. 유효한 값은 all, open, closed, hidden, none이에요. - all : 숨겨진 것을 포함해 어떤 인덱스와도 일치해요. - closed : 닫힌, 숨겨지지 않은 인덱스와 일치해요. - hidden : 숨겨진 인덱스와 일치해요. open, closed, 또는 둘 다와 함께 사용해야 해요. - none : 와일드카드 표현을 허용하지 않아요. - open : 열린, 숨겨지지 않은 인덱스와 일치해요. |
N/A |
| from | Integer | 시작 오프셋이에요. | 0 |
| ignore_unavailable | Boolean | false이면 요청이 없거나 닫힌 인덱스를 대상으로 할 때 오류를 반환해요. |
N/A |
| lenient | Boolean | true이면 쿼리 문자열의 형식 기반 쿼리 실패(예: 숫자 필드에 텍스트 제공)를 무시해요. |
N/A |
| max_docs | Integer | 처리할 최대 문서 수예요. 기본값은 모든 문서예요. | N/A |
| pipeline | String | 들어오는 문서를 전처리하는 데 사용할 파이프라인의 ID예요. 인덱스에 기본 ingest pipeline이 지정되어 있다면, 값을 _none으로 설정하면 이 요청에 대한 기본 ingest pipeline을 비활성화해요. final pipeline이 구성되어 있다면 이 파라미터 값과 무관하게 항상 실행돼요. |
N/A |
| preference | String | 작업을 수행할 노드나 샤드를 지정해요. 기본적으로 무작위예요. | random |
| q | String | Lucene 쿼리 문자열 문법의 쿼리예요. | N/A |
| refresh | Boolean 또는 String | true이면 OpenSearch가 영향받는 샤드를 새로고침해서 작업을 검색에 표시해요. 유효한 값은 다음과 같아요. - false : 영향받는 샤드를 새로고침하지 않아요. - true : 영향받는 샤드를 즉시 새로고침해요. - wait_for : 응답하기 전에 변경 사항이 보일 때까지 기다려요. |
N/A |
| request_cache | Boolean | true이면 이 요청에 요청 캐시를 사용해요. |
N/A |
| requests_per_second | Float | 초당 하위 요청 수로 표현한 이 요청의 스로틀(throttle)이에요. | 0 |
| routing | List 또는 String | 작업을 특정 샤드로 라우팅하는 데 사용하는 사용자 지정 값이에요. | N/A |
| scroll | String | 스크롤링을 위해 검색 컨텍스트를 유지하는 기간이에요. | N/A |
| scroll_size | Integer | 작업을 구동하는 스크롤 요청의 크기예요. | 100 |
| search_timeout | String | 각 검색 요청에 대한 명시적 제한 시간이에요. | N/A |
| search_type | String | 검색 작업의 유형이에요. 사용 가능한 옵션: query_then_fetch, dfs_query_then_fetch. 유효한 값은 다음과 같아요. - dfs_query_then_fetch : 모든 샤드의 전역 용어·문서 빈도로 문서에 점수를 매겨요. 보통 더 느리지만 더 정확해요. - query_then_fetch : 샤드의 로컬 용어·문서 빈도로 문서에 점수를 매겨요. 보통 더 빠르지만 덜 정확해요. |
N/A |
| size | Integer | 더 이상 사용되지 않아요(deprecated). max_docs를 사용하세요. |
N/A |
| slices | Integer 또는 String | 이 작업을 나눌 슬라이스 수예요. 유효한 값은 다음과 같아요. - auto : 슬라이스 수를 자동으로 결정해요. |
N/A |
| sort | List | : 쌍의 쉼표 구분 목록이에요. |
N/A |
| stats | List | 로깅과 통계 목적의 요청 특정 태그예요. | N/A |
| terminate_after | Integer | 각 샤드에 대해 수집할 최대 문서 수예요. 쿼리가 이 한도에 도달하면 OpenSearch가 쿼리를 조기에 종료해요. OpenSearch는 정렬 전에 문서를 수집해요. 주의해서 사용하세요. OpenSearch는 이 파라미터를 요청을 처리하는 각 샤드에 적용해요. 가능하면 OpenSearch가 자동으로 조기 종료를 수행하게 두세요. 여러 데이터 계층에 걸친 backing index를 가진 데이터 스트림을 대상으로 하는 요청에는 이 파라미터를 지정하지 마세요. | N/A |
| timeout | String | 각 업데이트 요청이 다음 작업을 기다리는 기간: 동적 매핑 업데이트, 활성 샤드 대기. | N/A |
| version | Boolean | true이면 hit의 일부로 문서 버전을 반환해요. |
N/A |
| wait_for_active_shards | Integer 또는 String 또는 NULL 또는 String | 작업을 진행하기 전에 활성화되어야 하는 샤드 복사본 수예요. all 또는 인덱스의 전체 샤드 수(number_of_replicas+1)까지의 양의 정수로 설정해요. 유효한 값은 다음과 같아요. - all : 모든 샤드가 활성화될 때까지 기다려요. |
N/A |
| wait_for_completion | Boolean | true이면 요청이 작업이 완료될 때까지 차단해요. |
true |
중요: update by query 요청에서 _source, _source_includes, _source_excludes를 사용하면, 이 설정들이 응답뿐 아니라 업데이트 스크립트가 사용할 수 있는 필드에도 영향을 줘요. _source에서 제외된 필드가 스크립트에서 명시적으로 처리되지 않으면, 업데이트 작업 중에 문서에서 제거될 수 있어요. 제외된 필드를 보존하려면 스크립트가 필요에 따라 해당 필드를 읽고 다시 할당하는지 확인하세요.
요청 본문 필드 (Request body fields)
요청 본문은 선택 사항이지만, 보통 어떤 문서를 업데이트할지 지정하는 쿼리와 업데이트 로직을 정의하는 스크립트를 포함해요.
| 필드 | 데이터 타입 | 설명 |
|---|---|---|
| query | Object | 업데이트할 문서를 선택하는 데 사용하는 쿼리예요. 지정하지 않으면 작업이 대상 인덱스의 모든 문서를 업데이트해요. 쿼리 유형에 대한 자세한 내용은 Query DSL을 참고하세요. |
| script | Object | 각 일치 문서에서 실행할 스크립트예요. source(스크립트 코드), lang(스크립트 언어, 보통 painless), 선택적인 params(스크립트에 전달되는 파라미터)를 포함해요. 스크립트는 ctx._source를 통해 문서에 접근하고 ctx.op을 설정해 작업을 제어할 수 있어요. 자세한 내용은 Painless scripting language를 참고하세요. |
| slice | Object | 병렬 처리를 위해 슬라이스 ID와 최대 슬라이스 수를 수동으로 지정해요. id(정수, 슬라이스 번호)와 max(정수, 전체 슬라이스 수)를 포함해요. 선택 사항이에요. |
| max_docs | Integer | 처리할 최대 문서 수예요. 선택 사항이에요. |
| conflicts | String | update by query 작업이 버전 충돌에 부딪히면 어떻게 할지예요. 계속하려면 proceed, 멈추려면 abort로 설정해요. 요청 본문이나 쿼리 파라미터로 지정할 수 있어요. 선택 사항이에요. |
스크립트 작업 (Script operations)
업데이트 스크립트 안에서 ctx.op을 설정해 각 문서에 일어나는 일을 제어할 수 있어요.
| 작업 | 설명 |
|---|---|
작업 없음 (noop) |
스크립트가 변경이 필요 없다고 판단하면 ctx.op = "noop"을 설정해 문서 업데이트를 건너뛰어요. OpenSearch는 건너뛴 문서를 응답의 noops 카운터에 보고해요. |
삭제 (delete) |
스크립트 로직에 따라 문서를 삭제하려면 ctx.op = "delete"를 설정해요. OpenSearch는 삭제된 문서를 응답의 deleted 카운터에 보고해요. |
ctx.op을 다른 값으로 설정하면 오류가 발생해요. ctx._source와 ctx.op 외의 ctx의 다른 필드를 수정해도 오류가 발생해요.
샤드 새로고침 (Refreshing shards)
refresh 파라미터를 지정하면 요청이 완료된 후 update by query 작업에 관여한 모든 샤드를 새로고침해요. 이 동작은 업데이트 요청을 받은 샤드만 새로고침하는 Update API의 refresh 파라미터와 달라요. Update by Query API는 refresh 파라미터에 wait_for 값을 지원하지 않아요.
update by query를 비동기로 실행하기 (Running update by query asynchronously)
update by query 작업을 비동기로 실행하려면 wait_for_completion 쿼리 파라미터를 false로 설정하세요. OpenSearch는 사전 점검(preflight check)을 수행하고 요청을 시작한 후, 진행 상황을 모니터링하거나 작업을 취소하는 데 사용할 수 있는 작업 ID(task ID)를 반환해요. 비동기로 실행하면 OpenSearch가 작업의 기록을 .tasks/task/${taskId} 문서로 만들어요. 작업이 완료된 후 작업 문서를 삭제해서 OpenSearch가 공간을 회수할 수 있게 하세요.
활성 샤드 기다리기 (Waiting for active shards)
wait_for_active_shards 파라미터는 요청을 처리하기 전에 몇 개의 샤드 복사본이 활성화되어야 하는지 제어해요. timeout 파라미터는 각 쓰기 요청이 사용할 수 없는 샤드를 기다리는 시간을 제어해요. 이 파라미터들은 Bulk API와 같은 방식으로 동작해요. Update by Query는 스크롤 검색을 사용하므로 scroll 파라미터로 검색 컨텍스트가 활성 상태로 유지되는 시간을 제어할 수 있어요. 기본 스크롤 시간은 5분이에요.
업데이트 요청 스로틀링 (Throttling update requests)
update by query가 업데이트 작업 배치를 내보내는 속도를 제어하려면 requests_per_second를 양의 십진수로 설정하세요. 그러면 각 배치에 대기 시간을 더해 속도를 스로틀링해요. requests_per_second를 -1로 설정하면 스로틀링을 비활성화해요.
스로틀링은 배치 사이의 대기 시간을 사용해서 내부 스크롤 요청에 요청 패딩을 반영한 제한 시간을 줄 수 있게 해요. 패딩 시간은 배치 크기를 requests_per_second로 나눈 값에서 쓰기 시간을 뺀 값이에요. 기본적으로 배치 크기는 1,000이므로 requests_per_second가 500으로 설정되면:
target_time = 1,000 / 500 per second = 2 seconds
wait_time = target_time - write_time = 2 seconds - 0.5 seconds = 1.5 seconds
각 배치가 단일 bulk 요청으로 내보내지기 때문에 큰 배치 크기는 OpenSearch가 요청을 많이 만들고 다음 배치를 시작하기 전에 기다리게 해요. 이는 높은 활동 기간과 이어지는 유휴 대기가 반복되는 고르지 않은 처리 패턴을 만들어요.
병렬 처리를 위한 슬라이싱 (Slicing for parallel processing)
슬라이싱을 사용하면 여러 스레드에서 업데이트 작업을 병렬로 실행할 수 있어요. 이 방식은 업데이트 작업을 독립적인 세그먼트로 나눠 대규모 업데이트의 성능을 개선해요.
slices를 auto로 설정하면 OpenSearch가 대부분의 인덱스에 적절한 수를 고르게 해요. 자동 슬라이싱을 사용하거나 수동으로 튜닝할 때는 다음 요소를 고려하세요.
- 슬라이스 수를 샤드 수와 일치시킬 때 최적의 쿼리 성능이 나와요. 하지만 샤드가 많은 인덱스(500개 이상)에서는 과도한 병렬화 오버헤드로 인한 성능 저하를 피하려면 슬라이스 수를 줄여 사용하세요. 슬라이스 수를 샤드 수보다 높게 설정하면 일반적으로 효율성이 개선되지 않고 오버헤드만 추가돼요.
- 업데이트 성능은 슬라이스 수에 따라 사용 가능한 리소스에 대해 선형적으로 확장돼요.
- 실행 시간을 지배하는 것이 쿼리인지 업데이트인지는 업데이트되는 문서와 사용 가능한 클러스터 리소스에 따라 달라져요.
예제: 소스를 바꾸지 않고 모든 문서 업데이트 (Example: Updating all documents without changing source)
다음 예제 요청은 소스를 수정하지 않고 인덱스의 모든 문서를 업데이트해요. 새 매핑 속성이나 다른 매핑 변경을 반영하는 데 유용해요.
예제: 쿼리 필터로 문서 업데이트 (Example: Updating documents with a query filter)
다음 예제 요청은 전자제품에 10% 할인을 추가해서 업데이트해요.
예제: 필드 값 증가 (Example: Incrementing a field value)
다음 예제 요청은 특정 사용자의 모든 제품에 대해 likes 카운터를 증가시켜요.
예제: 조건부 문서 삭제 (Example: Conditionally deleting documents)
다음 예제 요청은 좋아요가 0인 품절 제품을 삭제해요.
예제: 조건부 업데이트에 noop 사용 (Example: Using noop for conditional updates)
다음 예제 요청은 $100보다 비싼 제품에만 할인을 올리고, 그 외에는 아무 작업도 수행하지 않아요.
예제: 여러 인덱스에서 업데이트 (Example: Updating from multiple indexes)
다음 예제 요청은 여러 인덱스에 걸쳐 문서를 업데이트해요.
예제: 라우팅으로 대상 업데이트 (Example: Using routing for targeted updates)
다음 예제 요청은 업데이트 작업을 특정 라우팅 값을 가진 샤드로 제한해요.
예제: scroll_size로 배치 크기 제어 (Example: Using scroll_size to control batch size)
다음 예제 요청은 사용자 지정 스크롤 배치 크기 100개 문서를 사용해요.
예제: 병렬 처리를 위한 수동 슬라이싱 (Example: Manual slicing for parallel processing)
다음 예제 요청들은 업데이트 작업을 두 개의 슬라이스로 나눠 병렬 처리해요.
별도 요청으로 두 번째 슬라이스를 처리해요.
예제: 자동 슬라이싱 (Example: Automatic slicing)
다음 예제 요청은 자동 슬라이싱으로 업데이트 작업을 5개의 슬라이스로 병렬화해요.
OpenSearch가 최적의 슬라이스 수를 자동으로 결정하게 하려면 slices=auto를 사용하세요.
예제 응답 (Example response)
다음 예제 응답은 8개 문서를 업데이트한 성공적인 update by query 작업을 보여줘요.
{
"took": 39,
"timed_out": false,
"total": 8,
"updated": 8,
"deleted": 0,
"batches": 1,
"version_conflicts": 0,
"noops": 0,
"retries": {
"bulk": 0,
"search": 0
},
"throttled_millis": 0,
"requests_per_second": -1.0,
"throttled_until_millis": 0,
"failures": []
}
조건부 noop 작업이 있는 스크립트를 사용하면 응답에 건너뛴 문서 수를 보여주는 noops 수가 포함돼요.
{
"took": 55,
"timed_out": false,
"total": 8,
"updated": 4,
"deleted": 0,
"batches": 1,
"version_conflicts": 0,
"noops": 4,
"retries": {
"bulk": 0,
"search": 0
},
"throttled_millis": 0,
"requests_per_second": -1.0,
"throttled_until_millis": 0,
"failures": []
}
수동 슬라이싱을 사용하면 응답에 처리된 슬라이스를 나타내는 slice_id 필드가 포함돼요.
{
"took": 12,
"timed_out": false,
"slice_id": 0,
"total": 4,
"updated": 4,
"deleted": 0,
"batches": 1,
"version_conflicts": 0,
"noops": 0,
"retries": {
"bulk": 0,
"search": 0
},
"throttled_millis": 0,
"requests_per_second": -1.0,
"throttled_until_millis": 0,
"failures": []
}
응답 본문 필드 (Response body fields)
다음 표는 모든 응답 본문 필드를 보여줘요.
| 필드 | 데이터 타입 | 설명 |
|---|---|---|
| took | Integer | 전체 작업의 시작부터 끝까지 걸린 시간(밀리초)이에요. |
| timed_out | Boolean | update by query 작업 중 실행된 요청 중 하나라도 제한 시간을 넘겼는지 여부예요. true로 설정되면 성공적으로 완료된 업데이트는 계속 유지되고 롤백되지 않아요. |
| total | Integer | 성공적으로 처리된 전체 문서 수예요. |
| updated | Integer | 성공적으로 업데이트된 문서 수예요. |
| deleted | Integer | 삭제된 문서 수예요. 스크립트가 ctx.op = "delete"를 설정할 때 발생해요. |
| batches | Integer | update by query 작업이 처리한 스크롤 배치 수예요. |
| version_conflicts | Integer | update by query 작업이 만난 버전 충돌 수예요. 스냅샷을 찍은 시점과 업데이트 작업이 처리되는 시점 사이에 문서가 변경될 때 발생해요. |
| noops | Integer | 스크립트가 ctx.op = "noop"을 설정해서 무시된 문서 수예요. delete by query와 달리, 이 필드는 스크립트가 조건부로 업데이트를 건너뛸 때 0이 아닌 값을 가질 수 있어요. |
| retries | Object | update by query 작업이 시도한 재시도 횟수예요. bulk(bulk 작업 재시도 횟수)와 search(검색 작업 재시도 횟수)를 포함해요. |
| throttled_millis | Integer | requests_per_second를 따르기 위해 요청이 스로틀링된 시간(밀리초)이에요. |
| requests_per_second | Float | update by query 작업 중 실제로 실행된 초당 요청 수예요. |
| throttled_until_millis | Integer | 다음 스로틀링된 요청이 실행될 때까지 걸리는 시간(밀리초)이에요. 완료된 update by query 응답에서는 항상 0이에요. 이 필드는 Tasks API로 진행 중인 작업을 모니터링할 때만 의미가 있는데, 그때는 다음 스로틀링 요청이 실행될 시점을 나타내요. |
| slice_id | Integer | 이 응답의 슬라이스 번호예요. 수동 슬라이싱을 사용할 때만 존재해요. 이 응답이 나타내는 작업의 슬라이스를 가리켜요. |
| slices | Array | 특정 수의 자동 슬라이싱을 사용할 때의 슬라이스 결과 배열이에요. 각 요소는 메인 응답과 같은 응답 필드를 포함하며, 개별 슬라이스의 결과를 보여줘요. |
| failures | Array | 작업 중 복구할 수 없는 오류가 발생했다면 그 실패 배열이에요. 이 배열이 비어 있지 않으면 그 실패들 때문에 요청이 중단됐다는 뜻이에요. update by query는 배치로 구현되며, 어떤 실패든 전체 프로세스를 중단시키지만 현재 배치의 모든 실패는 이 배열에 수집돼요. conflicts 파라미터를 proceed로 설정하면 버전 충돌 시 작업이 중단되는 것을 막을 수 있어요. |
update by query 작업 관리 (Managing update by query tasks)
wait_for_completion=false로 설정해 update by query 작업을 비동기로 실행하면, OpenSearch가 작업을 모니터링·수정·취소하는 데 사용할 수 있는 작업 ID를 반환해요.
update by query 작업 상태 조회 (Retrieving the status of an update by query operation)
update by query 작업의 상태를 조회하려면 Tasks API를 사용해요.
GET _tasks?detailed=true&actions=*/update/byquery
응답에는 실행 중인 모든 update by query 작업의 상태가 포함돼요. 특정 작업의 상태를 조회하려면 작업 ID를 사용해요.
GET _tasks/<task_id>
응답에는 작업의 진행 상황에 대한 자세한 정보가 들어 있어요.
{
"nodes": {
"node_id": {
"tasks": {
"task_id": {
"status": {
"total": 1000,
"updated": 450,
"created": 0,
"deleted": 0,
"batches": 5,
"version_conflicts": 0,
"noops": 0,
"retries": 0,
"throttled_millis": 0
}
}
}
}
}
}
total 필드는 update by query 작업이 수행할 것으로 예상하는 총 작업 수를 나타내요. updated, deleted, noops 필드를 더해 합계를 total 필드와 비교하면 진행 상황을 추정할 수 있어요. 그 합이 total 필드와 같아지면 작업이 완료된 것이에요.
실행 중인 작업의 스로틀링 변경 (Changing throttling for a running operation)
실행 중인 update by query 작업의 스로틀링을 변경하려면 작업 ID로 Rethrottle API를 사용해요.
POST _update_by_query/<task_id>/_rethrottle?requests_per_second=100
requests_per_second를 양의 십진수 값 또는 -1로 설정해 스로틀링을 비활성화할 수 있어요. 작업을 빠르게 하는 재스로틀링은 즉시 적용돼요. 작업을 느리게 하는 재스로틀링은 스크롤 제한 시간을 막기 위해 현재 배치를 완료한 후 적용돼요.
update by query 작업 취소 (Canceling an update by query operation)
실행 중인 update by query 작업을 취소하려면 task cancel API를 사용해요.
POST _tasks/<task_id>/_cancel
취소는 빠르게 일어나야 하지만 몇 초가 걸릴 수 있어요. Tasks API는 취소를 확인하고 스스로 종료할 때까지 update by query 작업을 계속 나열해요. 슬라이스가 있는 update by query 작업을 취소하면 OpenSearch가 각 하위 요청을 취소해요.
필요한 권한 (Required permissions)
Security plugin을 사용한다면 indices:data/write/update/byquery 권한이 있는지 확인하세요.