본문 바로가기
개발/ELK

[Elasticsearch] 벌크 데이터 bulk API

by parkkingcar 2023. 3. 27.

 

데이터  CRUD 동작을 할 때, REST API를 호출해 하나하나 도큐먼트를 요청하는 것보다

 

벌크로 한번에 요청하는 것이 효율적입니다.

 

 

POST _bulk
{"index" : {"_index": "mydoc", "_id": "1"}}
{"field_test": "test", "field_test2": "test"}
{"create" : {"_index": "mydoc", "_id": "2"}}
{"field_test": "test", "field_test2": "test"}
{"update": {"_id" : "2", "_index": "mydoc"}}
{"doc": { "field_test" : "update"}}
{"delete": {"_index": "mydoc", "_id": "1"}}

 

위와 같이 bulk API 포맷을 작성하여 조회를 제외한 생성, 수정, 삭제가 가능합니다.

 

각 줄 사이에는 별도의 구분자가 없고 라인 사이 공백을 허용하지 않습니다.

 

 

 

 

그래서 위 포맷의 결과는 아래와 같습니다.

 

2번 줄에서, mydoc 인덱스의 ID가 1인 도큐먼트를 {"field_test": "test", "field_test2": "test"}의 필드에 값을 가지도록  생성

 

4번줄에서, mydoc 인덱스의 ID가 2인 도큐먼트를 {"field_test": "test", "field_test2": "test"}의 필드에 값을 가지도록  생성

(create는 덮어쓰기를 허용하지 않습니다. 도큐먼트가 존재할 경우 error반환)

 

6번줄에서, mydoc 인덱스의 ID가 2인 도큐먼트를 {"field_test": "update"}의 필드에 값을 가지도록  수정

 

8번줄에서, mydoc 인덱스의 ID가 1인 도큐먼트를 삭제

 

 

 

 

 

 

추가적으로 벌크데이터를 파일 형태로 만들어서 적용하는 방법도 있습니다.

 

{"index" : {"_index": "mydoc", "_id": "11"}}
{"field_test": "test", "field_test2": "test"}
{"create" : {"_index": "mydoc", "_id": "12"}}
{"field_test": "test", "field_test2": "test"}
{"update": {"_id" : "12", "_index": "mydoc"}}
{"doc": { "field_test" : "update"}}
{"delete": {"_index": "mydoc", "_id": "11"}}

위와 같이 파일을 bulk_test.json 파일로 작성한 뒤

 

윈도우 명령 프롬프트(CMD)에서 curl을 이용하여 REST API를 실행 할 수 있습니다.

 

 

 

 

파일의 경로로 이동하여 다음 명령어를 사용합니다.

curl -H "Content-Type: application/x-ndjson" -u elastic:changeme -XPOST localhost:9201/_bulk --data-binary @./bulk_test.json

 

-H는 curl의 헤더옵션으로 NDJSON 타입의 콘텐츠를 사용한다는 의미입니다.

 

-u는 엘라스틱에서 설정한 ID와 비밀번호입니다. (위에서는 초기값)

 

-X는 요청 매소드를 기술합니다.

 

localhost:9201은 엘라스틱서치가 동작하는 호스트 주소이고 /_bulk는 bulk API를 호출합니다.

 

--data-binary는 POST 매소드에 우리가 만든 파일을 바이너리 형태로 전송해주는 파라미터입니다.

 

 

 

 

 

주의할 점은 _bulk 의 명령문과 데이터문은 반드시 한 줄 안에 입력이 되어야 하며 줄바꿈을 허용하지 않는다 입니다.

 

{
	"index":{
    	"_index": "test",
        "_id": "1"
    }
}

위와 같이 JSON 포맷과 같이 포맷팅 할 경우 동작하지않습니다.

 

 

댓글