본문 바로가기

엘라스틱 서치

엘라스틱서치 데이터 삽입, 조회, 수정, 삭제, _bulk API

1. 개요

엘라스틱서치에 데이터를 삽입, 수정, 삭제를 해 보도록 하겠습니다. 참고로, 엘라스틱서치의 모든 요청은 REST API를 사용합니다. 엘라스틱서치의 경우 버전마다 변경사항이 매우 큽니다. 때문에, 버전을 잘 확인해보시기 바랍니다.

💡 이 글은 7.0 ~ 8.X 사이의 버전을 타켓으로 하고 있습니다.

 

추가로, 제 엘라스틱서치의 버전은 8.7입니다.

엘라스틱 8.0이후 버전은 Security로 인해 모든 요청에 사용자 인증이 필요합니다.

때문에 저와 같이 Postman을 쓰시는 분들은 아래 그림과 같이 인증 셋팅이 필요합니다.

💡 자세한 인증 사항은 https://ksb-dev.tistory.com/309 에서 알 수 있습니다.

 

2. 삽입

엘라스틱서치에 데이터를 삽입하기 위해서는 PUT 요청으로 아래와 같이 보내야 합니다.

PUT <인덱스>/_doc/<다큐먼트번호>

💡 엘라스틱서치에서 인덱스는 RDB의 테이블이라 생각하시면 됩니다. 다큐먼트는 데이터가 저장되는 최소 단위입니다.

 

[Request]

PUT ksb/_doc/1
{
    "id" : "1",
    "message" : "1번 데이터 입니다."
}

 

[Response]

{
    "_index": "ksb", # 해당 데이터가 삽입되는 인덱스 이름입니다. 인덱스는 자동적으로 생성된 것입니다.
    "_id": "1", # 다큐먼트번호 입니다.
    "_version": 1,
    "result": "created", # 생성되었다는 것을 의미합니다.
    "_shards": {
        "total": 2,
        "successful": 1,
        "failed": 0
    },
    "_seq_no": 0,
    "_primary_term": 1
}

 

3. 조회

엘라스틱서치에 데이터를 조회하기 위해서는 GET 요청으로 아래와 같이 보내야 합니다.

GET <인덱스>/_doc/<다큐먼트번호>

 

[Request]

GET ksb/_doc/1

 

[Response]

{
    "_index": "ksb",
    "_id": "1",
    "_version": 1,
    "_seq_no": 0,
    "_primary_term": 1,
    "found": true,
    "_source": { # 조회된 데이터가 표시 됩니다.
        "id": "1",
        "message": "1번 데이터 입니다."
    }
}

 

4. 수정

엘라스틱서치에 데이터를 수정하기 위해서는 POST 요청으로 아래와 같이 보내야 합니다.

POST <인덱스>/_update/<다큐먼트번호>

💡 엘라스틱서치는 수정의 요청이 들어와도 내부적으로는 새로운 데이터를 생성하여 덮어 씌웁니다.

 

[Request]

POST ksb/_update/1
{
    "doc" : {
        "message" : "0번 데이터 입니다."
    }
}

 

[Response]

{
    "_index": "ksb",
    "_id": "1",
    "_version": 2, # 수정되면 버전이 올라가서 이전 버전의 데이를 덮어 씌웁니다.
    "result": "updated", # 데이터 수정이 발생되었다는 것을 의미합니다.
    "_shards": {
        "total": 2,
        "successful": 1,
        "failed": 0
    },
    "_seq_no": 1,
    "_primary_term": 1
}

 

5. 삭제

엘라스틱서치에 데이터를 삭제하기 위해서는 DELETE 요청으로 아래와 같이 보내야 합니다.

DELETE <인덱스>/_doc/<다큐먼트번호>

 

[Request]

DELETE ksb/_doc/1

 

[Response]

{
    "_index": "ksb",
    "_id": "1",
    "_version": 3, # 버전이 올라갔습니다.
    "result": "deleted", # 데이터가 삭제되었다는 것을 의미합니다.
    "_shards": {
        "total": 2,
        "successful": 1,
        "failed": 0
    },
    "_seq_no": 2,
    "_primary_term": 1
}

 

6. _bulk API

엘라스틱서치의 여러 명령어를 배치로 수행하기 위해 _bulk API가 제공됩니다. _bulk API로 index, create, update, delete의 동작이 가능하며 delete를 제외하고는 명령문 데이터문 순서대로 입력해야 합니다. delete문은 내용이 필요 없어 명령문만 존재합니다.

요청은 아래와 같습니다.

POST _bulk

 

[Request]

POST _bulk
{"index":{"_index":"ksb", "_id":"1"}}
{"field":"one"}
{"index":{"_index":"ksb", "_id":"2"}}
{"field":"two"}
{"delete":{"_index":"ksb", "_id":"2"}}
{"create":{"_index":"ksb", "_id":"3"}}
{"field":"three"}
{"update":{"_index":"ksb", "_id":"1"}}
{"doc":{"field":"two"}}

💡 맨 마지막줄에 공백(엔터)가 있어야 합니다.

 

[Response]

{
    "took": 145,
    "errors": false,
    "items": [
        {
            "index": {
                "_index": "ksb",
                "_id": "1",
                "_version": 1,
                "result": "created",
                "_shards": {
                    "total": 2,
                    "successful": 1,
                    "failed": 0
                },
                "_seq_no": 3,
                "_primary_term": 1,
                "status": 201
            }
        },
        {
            "index": {
                "_index": "ksb",
                "_id": "2",
                "_version": 1,
                "result": "created",
                "_shards": {
                    "total": 2,
                    "successful": 1,
                    "failed": 0
                },
                "_seq_no": 4,
                "_primary_term": 1,
                "status": 201
            }
        },
        {
            "delete": {
                "_index": "ksb",
                "_id": "2",
                "_version": 2,
                "result": "deleted",
                "_shards": {
                    "total": 2,
                    "successful": 1,
                    "failed": 0
                },
                "_seq_no": 5,
                "_primary_term": 1,
                "status": 200
            }
        },
        {
            "create": {
                "_index": "ksb",
                "_id": "3",
                "_version": 1,
                "result": "created",
                "_shards": {
                    "total": 2,
                    "successful": 1,
                    "failed": 0
                },
                "_seq_no": 6,
                "_primary_term": 1,
                "status": 201
            }
        },
        {
            "update": {
                "_index": "ksb",
                "_id": "1",
                "_version": 2,
                "result": "updated",
                "_shards": {
                    "total": 2,
                    "successful": 1,
                    "failed": 0
                },
                "_seq_no": 7,
                "_primary_term": 1,
                "status": 200
            }
        }
    ]
}

 

7. 마무리

엘라스틱서치의 아주 기본적인 CRUD 동작만을 실습했습니다.

어렵거나 복잡한 내용을 제외하려다 보니 많은 내용이 빠질 수 밖에 없었는데, 자세한 내용을 알고 싶은 문은 이 글을 작성할 때 참고한 아래 링크를 통해 확인하시기 바랍니다.

https://esbook.kimjmin.net/04-data

 

4. Elasticsearch 데이터 처리 - Elastic 가이드북

Elasticsearch는 데이터 저장 형식으로 json 도큐먼트를 사용합니다. 데이터 저장 형식 뿐 아니라 쿼리와 클러스터 설정 등 모든 정보를 json 형태로 주고받기 때문에 elasticsearch의 사용을 위해서는 json

esbook.kimjmin.net