😽 초간단 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
}
참고
'데이터베이스 > 0 + Elasticsearch' 카테고리의 다른 글
[Elasticsearch] Elasticsearch 검색 심화 풀 텍스트 쿼리(Full Text Query) (0) | 2023.12.28 |
---|---|
[Elasticsearch] 초간단 REST API를 사용한 Elasticsearch CRUD (1) | 2023.12.28 |
[Elasticsearch] ✂️ 10분 컽 초간단 Elasticsearch + kibana 설치 매뉴얼 (0) | 2023.12.13 |
[Elasticsearch] 핵심만 콕콕 Elasticsearch 기본 개념 (0) | 2023.12.07 |