본문 바로가기
TIL/엘라스틱 서치

Elastic Search : Complete Guide to ElasticSearch - Bulk API

by yeon_zoo 2024. 1. 16.

[Bulk API]
하나의 query로 많은 도큐먼트들을 indexing, update, delete 하는 방법.
각 줄의 끝에 줄 바꿈을 통해 실행 (NDJSON 형태)

POST /_bulk
{"index": {"_index": "products", "_id": 200}} // 액션 및 메타 데이터 정의
{"name": "Espresson Machine", "price":199, "in_stock":5} // 소스 도큐먼트 정의
{"create": { "_index": "products", "_id": 201}}
{"name": "Milk Frother", "price": 149, "in_stock":14}


[Create 액션과 index 액션의 차이]
Create 액션은 이미 도큐먼트가 존재하면 fail / index 액션은 도큐먼트가 존재하면 replace 된다.

POST /_bulk
{ "update": { "_index": "products", "_id": 201 }  }
{  "doc": { "price" : 129 }  }
{ "delete": { "_index": "products", "_id": 200 }  }


각 액션이 다 같은 index의 도큐먼트를 변경하는 일이라면 아래처럼 query 에 인덱스 키를 추가할 수 있다.

POST /products/_bulk
{ "update": { "_id": 201 }  }
{  "doc": { "price" : 129 }  }
{ "delete": { "_id": 200 }  }



[Bulk api 사용 시 주의 점]

  • HTTP Content-Type 헤더가 application/x-ndjson 이어야 한다.
    • Application/json 도 허용하기는 하지만 편의상 제공하는 것 뿐 올바른 방법은 아니다.
  • 각 줄은 \n이나 \r\n 같은 개행 문자로 끝나야 한다.
    • 가장 마지막 줄도 마찬가지다. 텍스트 에디터에서는 마지막 줄이 비어있어야 한다는 뜻.
    • 키바나 콘솔에서는 자동으로 처리된다.
    • 주로 스크립트는 파일의 데이터를 request body에 담게 된다. 따라서 파일의 마지막 줄은 비어있어야 한다.
    • 직접 \n을 칠 필요는 없고 엔터를 치면 된다
  • 하나의 액션이 실패했다고 다른 액션이 실패하는 것은 아니다. = Bulk request 전체가 abort되는 것이 아님
    • Bulk api는 각 액션에 대한 상세 정보를 제공한다 (성공 / 실패 여부 등)
    • 한 액션의 성공 / 실패 여부를 조사하기 위해서 부여된 items의 key 값을 확인해야 한다. Items key는 액션이 작성된 순서와 동일한 순서로 구성되어 있다.


[Bulk api 사용이 적합할 때]

  • 한 번에 많은 쓰기 연산이 필요할 때 (e.g. 데이터를 받아오거나 수정이 많은 경우)
  • 각각의 쓰기 요청을 보내는 것보다 더 효율적이다.
  • 네트워크 자원 자체를 적게 씀

그 외..

  • Routing은 도큐먼트가 속한 샤드를 결정하는 데 사용된다. (필요 시 라우팅을 커스텀할 수 있음)
  • Bulk API는 낙관적 동시성 제어를 지원한다.
    • if_primary_term 이나 if_seq_no 파라미터를 액션 메타데이터에 추가할 수 있다
    • 동시 연산의 결과로 도큐먼트를 덮어쓰는 실수를 저지르고 싶지 않은 경우에 수행하기 좋다.


+) cURL 에서 파일 업로드 해봄!

curl -H "Content-Type: application/x-ndjson" -XPOST http://localhost:9200/products/_bulk\?pretty --data-binary "@products-bulk.json"

댓글