데이터베이스/0 + Elasticsearch

[Elasticsearch] 초간단 REST API를 사용한 Elasticsearch CRUD

힘들면힘을내는쿼카 2023. 12. 13. 01:46
728x90
반응형

😽 초간단 REST API를 사용한 Elasticsearch CRUD

여기에 작성한 모든 내용은 Elastic 가이드 북를 참고하여 작성했습니다.
더 자세한 내용을 알고싶으면 해당 링크로 이동해주세요.^^

 

 

Elasticsearch와 Kibana 설치를 완료했으면, 이제 실습을 진행해 볼까요^^??

2023.12.13 - [데이터베이스/0 + Elasticsearch] - [Elasticsearch] ✂️ 10분 컽 초간단 Elasticsearch + kibana 설치 매뉴얼

 

Kibana에 접속하고
메뉴 > Management > Dev Tools 로 이동합니다.

 

 

URL 구조

Elasticsearch에서는 단일 도큐먼트 별로 고유한 URL을 갖고 있습니다.
https://<호스트>:<포트>/<인덱스>/_doc/<도큐먼트 id>

 

Create

Elasticsearch 7.0 부터는 도큐먼트 타입 개념이 사라지고 대신 고정자 _doc 으로 접근해야 합니다.

 

PUT: _doc 사용

데이터를 입력할 때는 PUT 메소드를 사용합니다.
다음은 kibana를 이용해서 my_index 인덱스에 도큐먼트 id가 1인 데이터를 입력하는 예제입니다.

Request

PUT /members/_doc/1
{
  "name": "Seaung Jang",
  "age": 20
}

 

Response

{
  "_index" : "members", /* 인덱스 이름 */
  "_id" : "1",            /* 도큐먼트 아이디 */
  "_version" : 1,        /* 버전 정보 */
  "result" : "created",    /* 요청 수행 결과 */
  "_shards" : {
    "total" : 2,            /* 샤드 총 갯수 */
    "successful" : 1,
    "failed" : 0
  },
  "_seq_no" : 0,            /* 시퀀스 번호(동시성과 관련) */
  "_primary_term" : 1
}

 

[PUT] 만약 여기서 똑같은 요청을 다시 보낸다면? 🤔

버전 정보와 결과가 달라진것을 확인할 수 있습니다.
버전 정보는 기존1에서 2로 변경되었고, 결과created에서 update로 변경되었습니다.

 

PUT: _doc 대신 _create 사용

실수로 기존 도큐먼트가 덮어씌워지는 것을 방지하기 위해서 입력 명령에 _doc 대신 _create 를 사용해서 새로운 도큐먼트의 입력만 허용하는 것이 가능합니다.

 

입력하려는 도큐먼트 id에 이미 데이터가 있는 경우 아래와 같이 입력 오류가 나게 됩니다.

Request

PUT /members/_create/1
{
  "name": "Seaung Jang",
  "age": 20
}

 

Response

# 입력하려는 도큐먼트 id에 이미 데이터가 있는 경우 아래와 같이 입력 오류 발생
{
  "error" : {
    "root_cause" : [
      {
        "type" : "version_conflict_engine_exception",
        "reason" : "[1]: version conflict, document already exists (current version [2])",
        "index_uuid" : "06dMioXxRayxQf7QaMWVFA",
        "shard" : "0",
        "index" : "members"
      }
    ],
    "type" : "version_conflict_engine_exception",
    "reason" : "[1]: version conflict, document already exists (current version [2])",
    "index_uuid" : "06dMioXxRayxQf7QaMWVFA",
    "shard" : "0",
    "index" : "members"
  },
  "status" : 409
}

 

POST를 사용하면 자동으로 도큐먼트 id가 생성된다.

POST 메서드는 PUT 메서드와 유사하게 데이터 입력에 사용이 가능합니다.
도큐먼트를 입력할 때 POST 메서드로 <인덱스>/_doc 까지만 입력하게 되면 자동으로 임의의 도큐먼트id 가 생성됩니다.

도큐먼트id의 자동 생성은 PUT 메서드로는 동작하지 않습니다.

 

POST 메소드를 사용하면 도큐먼트 id가 A75MMIwBXfkyaYYV7gY1자동 생성 된 것을 확인할 수 있습니다!!

Request

POST /members/_doc
{
  "name": "Soyoung Yu",
  "age": 25
}

 

Response

{
  "_index" : "members",
  "_id" : "A75MMIwBXfkyaYYV7gY1",    /* 자동으로 아이디 생성 */
  "_version" : 1,
  "result" : "created",                /* 요청 수행 결과 */
  "_shards" : {
    "total" : 2,
    "successful" : 1,
    "failed" : 0
  },
  "_seq_no" : 2,
  "_primary_term" : 1
}

 

[POST] 만약 여기서 똑같은 요청을 다시 보낸다면? 🤔

PUT 메소드와 다르게 도큐먼트가 새로 생성되는 것을 확인할 수 있습니다.!

Read

GET

GET 메서드로 가져올 도큐먼트의 URL을 입력하면 도큐먼트의 내용을 조회할 수 있습니다.
다양한 정보가 함께 표시되며 문서의 내용은 _source 항목에서 확인할 수 있습니다.^^

Request

GET /members/_doc/1

 

Response

{
  "_index" : "members",        /* 인덱스 */
  "_id" : "1",                /* 도큐먼트 아이디 */
  "_version" : 2,            /* 도큐먼트 버전 정보 */
  "_seq_no" : 1,
  "_primary_term" : 1,
  "found" : true,
  "_source" : {                /* 내용 */
    "name" : "Seaung Jang",
    "age" : 20
  }
}

 

Update

입력된 도큐먼트를 수정하기 위해서는 기존 도큐먼트의 URL에 변경될 내용의 도큐먼트 내용을 다시 PUT 하는 것으로 대치가 가능합니다.

 

하지만 필드가 여럿 있는 도큐먼트에서 필드 하나만 바꾸기 위해 전체 도큐먼트 내용을 매번 다시 입력하는 것은 번거로운 작업입니다. 🥲
이 때는 POST <인덱스>/_update/<도큐먼트 id> 명령을 이용해 원하는 필드의 내용만 업데이트할 수 있습니다!


업데이트 할 내용에 "doc" 이라는 지정자를 사용합니다.

 

도큐먼트 id 1인 도큐먼트의 age를 20에서 39로 변경해보겠습니다.

 

Request

POST /members/_update/1
{
  "doc": {
    "age": 39
  }
}

 

Response

{
  "_index" : "members",
  "_id" : "1",
  "_version" : 3,            /* 버전 정보 */
  "result" : "updated",        /* 요청 수행 결과 */
  "_shards" : {
    "total" : 2,
    "successful" : 1,
    "failed" : 0
  },
  "_seq_no" : 4,
  "_primary_term" : 1
}

 

조회 해보면 변경된 것을 확인할 수 있습니다.^^

Request

GET /members/_doc/1

 

Delete

DELETE 메서드를 이용해서 도큐먼트 또는 인덱스 단위의 삭제가 가능합니다.

 

도큐먼트 삭제

Request

DELETE /members/_doc/1

 

Response

{
  "_index" : "members",
  "_id" : "1",
  "_version" : 4,
  "result" : "deleted",        /* 요청 수행 결과 */
  "_shards" : {
    "total" : 2,
    "successful" : 1,
    "failed" : 0
  },
  "_seq_no" : 5,
  "_primary_term" : 1
}

 

도큐먼트만 삭제한 후에 도큐먼트를 조회하면? 🤔

현재 도큐먼트만 삭제하고 인덱스는 삭제하지 않은 상황입니다.
인덱스에 도큐먼트 id가 1인 도큐먼트를 조회하면 아래와 같은 응답을 받을 수 있습니다.

Request

GET /members/_doc/1

 

Response

{
  "_index" : "members",    /* members 인덱스 */
  "_id" : "1",
  "found" : false         /* 조회 결과 */
}

 

인덱스 삭제

이제 members 인덱스를 삭제해 봅시다.

Request

DELETE /members

 

Response

{
  "acknowledged" : true
}

 

인덱스 삭제 후 조회하면?

인덱스를 찾을 수 없다는 응답을 받게 됩니다.

Request

GET /members/_doc/1

 

Response

{
  "error" : {
    "root_cause" : [
      {
        "type" : "index_not_found_exception",
        "reason" : "no such index [members]",
        "resource.type" : "index_expression",
        "resource.id" : "members",
        "index_uuid" : "_na_",
        "index" : "members"
      }
    ],
    "type" : "index_not_found_exception",
    "reason" : "no such index [members]",
    "resource.type" : "index_expression",
    "resource.id" : "members",
    "index_uuid" : "_na_",
    "index" : "members"
  },
  "status" : 404
}

 

참고

 

Elastic 가이드 북 - Elastic 가이드북

7. 인덱스 설정과 매핑 - Settings & Mappings

esbook.kimjmin.net

 

 

 

728x90
반응형