처음으로 도큐먼트를 입력하면 결과에 "result" : "created" 로 표시가 됩니다. 동일한 URL에 다른 내용의 도큐먼트를 다시 입력하게 되면 기존 도큐먼트는 삭제되고 새로운 도큐먼트로 덮어씌워지게 됩니다. 이 때는 결과에 created가 아닌 updated가 표시됩니다.
my_index/_doc/1 재입력
PUT my_index/_doc/1{"name":"Jongmin Kim","message":"안녕하세요 Kibana"}
실수로 기존 도큐먼트가 덮어씌워지는 것을 방지하기 위해서는 입력 명령에 _doc 대신 _create 를 사용해서 새로운 도큐먼트의 입력만 허용하는 것이 가능합니다. 입력하려는 도큐먼트 id에 이미 데이터가 있는 경우 아래와 같이 입력 오류가 나게 됩니다. 6.x 이전 버전에서는
PUT <인덱스>/<도큐먼트 타입>/<도큐먼트 id>/_create
형식으로 사용합니다.
_doc 대신 _create 로 새 도큐먼트 입력
PUT my_index/_create/1{"name":"Jongmin Kim","message":"안녕하세요 Elasticsearch"}
이미 있는 도큐먼트인 경우 _create 명령 실행 불가
{"error": {"root_cause": [ {"type":"version_conflict_engine_exception","reason":"[1]: version conflict, document already exists (current version [2])","index_uuid":"qYOJI9ELR2-HqVtgTeI9jw","shard":"0","index":"my_index" } ],"type":"version_conflict_engine_exception","reason":"[1]: version conflict, document already exists (current version [2])","index_uuid":"qYOJI9ELR2-HqVtgTeI9jw","shard":"0","index":"my_index" },"status": 409}
조회 (GET)
GET 메서드로 가져올 도큐먼트의 URL을 입력하면 도큐먼트의 내용을 가져옵니다. 다양한 정보가 함께 표시되며 문서의 내용은 _source 항목에 나타납니다.
DELETE 메서드를 이용해서 도큐먼트 또는 인덱스 단위의 삭제가 가능합니다. 두 경우에 차이가 있는데 먼저 DELETE my_index/_doc/1 명령으로 하나의 도큐먼트를 삭제하면 다음과 같이 도큐먼트가 삭제되었다는 "result" : "deleted" 결과가 리턴됩니다.
이제 DELETE my_index 으로 전체 인덱스를 삭제하면 다음과 같이 "acknowledged" : true 응답만 리턴됩니다.
my_index 인덱스 전체 삭제
DELETE my_index
my_index 인덱스 전체 삭제 결과
{"acknowledged" : true}
삭제된 인덱스 또는 처음부터 없는 인덱스의 도큐먼트를 조회하려고 하면 도큐먼트를 못 찾았다는 "found" : false 응답이 아니라 다음과 같이 "type" : "index_not_found_exception" , "status" : 404 오류가 리턴됩니다.
삭제된 my_index 인덱스의 도큐먼트 조회
GET my_index/_doc/1
삭제된 my_index 인덱스의 조회 결과
{"error" : {"root_cause": [ {"type":"index_not_found_exception","reason":"no such index [my_index]","resource.type":"index_expression","resource.id":"my_index","index_uuid":"_na_","index":"my_index" } ],"type":"index_not_found_exception","reason":"no such index [my_index]","resource.type":"index_expression","resource.id":"my_index","index_uuid":"_na_","index":"my_index" },"status" : 404}
수정 (POST)
POST 메서드는 PUT 메서드와 유사하게 데이터 입력에 사용이 가능합니다. 도큐먼트를 입력할 때 POST 메서드로 <인덱스>/_doc 까지만 입력하게 되면 자동으로 임의의 도큐먼트id 가 생성됩니다. 도큐먼트id의 자동 생성은 PUT 메서드로는 동작하지 않습니다.
POST 명령으로 my_index/_doc 도큐먼트 입력
POST my_index/_doc{"name":"Jongmin Kim","message":"안녕하세요 Elasticsearch"}
위 결과에서 도큐먼트 id "_id" : "ZuFv12wBspWtEG13dOut" 가 자동 생성 된 것을 확인할 수 있습니다.
_update
입력된 도큐먼트를 수정하기 위해서는 기존 도큐먼트의 URL에 변경될 내용의 도큐먼트 내용을 다시 PUT 하는 것으로 대치가 가능합니다. 하지만 필드가 여럿 있는 도큐먼트에서 필드 하나만 바꾸기 위해 전체 도큐먼트 내용을 매번 다시 입력하는 것은 번거로운 작업일 것입니다. 이 때는 POST <인덱스>/_update/<도큐먼트 id> 명령을 이용해 원하는 필드의 내용만 업데이트가 가능합니다. 업데이트 할 내용에 "doc" 이라는 지정자를 사용합니다.
_update API를 이용해서 my_index/_doc/1 도큐먼트의 "message" 필드 값을 "안녕하세요 Kibana" 로 업데이트를 한 뒤 도큐먼트 내용을 확인 해 보겠습니다. my_index/_doc/1 도큐먼트를 삭제 하였다면 위의 입력 (PUT) 내용을 참고해서 새로 입력 한 뒤 아래 명령을 실행합니다.
my_index/_update/1 도큐먼트의 message 필드 업데이트
POST my_index/_update/1{"doc": {"message":"안녕하세요 Kibana" }}
위 결과를 보면 "_version" : 2로 버전이 증가한 것을 확인할 수 있습니다. _update API 를 사용해서 단일 필드만 수정하는 경우에도 실제로 내부에서는 도큐먼트 전체 내용을 가져와서_doc 에서 지정한 내용을 변경한 새 도큐먼트를 만든 뒤 전체 내용을 다시 PUT 으로 입력하는 작업을 진행합니다.
6.x 이전 버전에서 _update API 는
POST <인덱스>/<도큐먼트 타입>/<도큐먼트 id>/_update
형식으로 사용합니다.