Elasticsearch CRUD 작업 + Bulk API

Elasticsearch는 다음과 같은 프로그램에서 REST API 를 호출하여 조작할 수 있다.

  • Kibana Dev Tools
  • cURL
  • 기타 등등

CRUD 작업 + Bulk API

Elasticsearch의 REST API 에서는 문서에 대해 다음과 같은 CRUD 작업이 가능하다.

REST API 해당 CRUD 설명
Index API Create 문서를 색인에 추가
Get API Read 문서 조회
Update API Update 문서 변경
Delete API Delete 문서 삭제

위를 Single document APIs 라고 하며, 한 번의 API 호출로 하나의 문서를 작업한다.

한번의 API 호출로 여러 문서를 작업하려면 Bulk API 를 사용한다.

Index API (Create)

Index API를 사용하여 Elasticsearch 색인에 문서를 추가한다.

Index API를 사용하는 방법은 다음과 같다.

Index API 사용 (curl 사용)

curl "localhost:9200/2021-12-tweet/_doc/1?pretty" -XPUT -H "Content-Type: application/json" -d '
{
  "date":"2021/12/13 09:00 KST",
  "Tweet":"트위터를 시작했습니다.",
  "User ID":"devkuma"
}'

Index API 사용 (Kinbana 사용)

PUT /2021-12-tweet/_doc/1
{
  "date":"2021/12/13 09:00 KST",
  "Tweet":"트위터를 시작했습니다.",
  "User ID":"devkuma"
}

Kibana의 DevTools를 사용하는 경우에는 위에 명령어를 붙여 넣고 오른쪽 상단의 삼각 버튼을 누른다.

데이터 스트림에 문서를 추가하는 경우

데이터 스트림이란, 복수의 인덱스를 1개에 모은 것이다.

데이터 스트림에 대한 자세한 내용은 아래 공식 문서를 찾아 보길 바란다.

Data streams | Elasticsearch Guide [7.16] | Elastic

데이터 스트림에 도큐먼트를 추가하기 위해서는, 아래와 같이 REST API 를 이용한다.

Index API 사용 (Kibana 사용)

PUT /tweet/_create/1
{
  "date" : "2021/12/13 09:00 KST",
  "Tweet" : "트위터를 시작했습니다.",
  "User ID" : "devkuma"
}

Get API (Read)

Get API를 사용하여 만든 문서를 조회한다.

Get API 사용 (curl 사용)

curl "localhost:9200/2021-12-tweet/_doc/1?pretty"

Get API 사용 (Kibana 사용)

GET /2021-12-tweet/_doc/1

위 명령어의 응답

{
  "_index" : "2021-12-tweet",
  "_type" : "_doc",
  "_id" : "1",
  "_version" : 1,
  "_seq_no" : 0,
  "_primary_term" : 1,
  "found" : true,
  "_source" : {
    "date" : "2021/12/13 09:00 KST",
    "Tweet" : "트위터를 시작했습니다.",
    "User ID" : "devkuma"
  }
}

Update API (Update)

Update API를 사용 하여 도큐먼트를 수정한다.

Update API 사용 (curl 사용)

curl "localhost:9200/2021-12-tweet/_update/1?pretty" -XPOST -H "Content-Type: application/json" -d '
{
  "doc" : {
    "date" : "2021/12/13 09:00 KST",
    "Tweet" : "문서를 업데이트했습니다.",
    "User ID" : "devkuma" 
  }
}'

Update API 사용 (Kibana 사용)

POST /2021-12-tweet/_update/1
{
  "doc" : {
    "date" : "2021/12/13 09:00 KST",
    "Tweet" : "문서를 업데이트했습니다.",
    "User ID" : "devkuma" 
  }
}

수정 결과를 Get API로 확인한다.

Update 결과 확인 (curl 사용)

curl "localhost:9200/2021-12-tweet/_doc/1?pretty"

Update 결과 확인 (Kibana 사용)

GET /2021-12-tweet/_doc/1

위 명령어의 응답

{
  "_index" : "2021-12-tweet",
  "_type" : "_doc",
  "_id" : "1",
  "_version" : 2,
  "_seq_no" : 1,
  "_primary_term" : 1,
  "found" : true,
  "_source" : {
    "date" : "2021/12/13 09:00 KST",
    "Tweet" : "문서를 업데이트했습니다.",
    "User ID" : "devkuma"
  }
}

Delete API (Delete)

Delete API으로 도규먼트를 삭제한다.

Delete API 사용 (curl 사용)

curl "localhost:9200/2021-12-tweet/_doc/1?pretty" -XDELETE

Delete API 사용 (Kibana 사용)

DELETE /2021-12-tweet/_doc/1

문서가 삭제되었음을 Get API롷 확인한다.

Delete 결과 확인 (curl 사용)

curl "localhost:9200/2021-12-tweet/_doc/1?pretty"

Delete 결과 확인 (Kibana 사용)

GET /2021-12-tweet/_doc/1

위 명령어의 응답

{
  "_index" : "2021-12-tweet",
  "_type" : "_doc",
  "_id" : "1",
  "found" : false
}

Bulk API(일괄 처리)

지금까지 REST API로 한번에 하나의 도큐먼트만 작업을 하였다.

Bulk API를 사용하면 REST API로 한번에 여러 문서를 일괄적으로 작업을 할 수 있다.

Bulk API 의 사용 방법은 다음과 같다.

bulk.json의 내용

{ "index" : { "_index" : "test", "_id" : "1" } }
{ "field1" : "value1" }
{ "delete" : { "_index" : "test", "_id" : "2" } }
{ "create" : { "_index" : "test", "_id" : "3" } }
{ "field1" : "value3" }
{ "update" : { "_id" : "1", "_index" : "test" } }
{ "doc" : { "field2" : "value2" } }

Bulk API 사용 (curl 사용)

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

Bulk API 사용 (Kibana 사용)

POST /_bulk 
{ "index" : { "_index" : "test", "_id" : "1" } }
{ "field1" : "value1" }
{ "delete" : { "_index" : "test", "_id" : "2" } }
{ "create" : { "_index" : "test", "_id" : "3" } }
{ "field1" : "value3" }
{ "update" : { "_id" : "1", "_index" : "test" } }
{ "doc" : { "field2" : "value2" } }

Create, Index와 Update의 차이점은 다음과 같다.

  • Create: 인덱스의 도큐먼트가 없는 경우 생성한다.
  • Index: 인덱스의 도큐먼트를 바꾼다.
  • Update: 인덱스의 도큐먼트를 문서의 일부 변경한다.

참조