ElasticSearch Document API ( 색인, 조회, 삭제)

윤들윤들·2021년 2월 17일
0
post-thumbnail

바로 직전에 포스팅에서 인덱스를 등록하였으니 그 다음은 바로 실제로 도큐먼트를 넣어보는것입니다.

ElasticSearch에서는 Document API를 제공하여 색인, 조회, 삭제, 수정기능을 제공합니다.

Index API : 한건의 Document를 색인 시킨다.
Get API : 한건의Document를 조회한다.
Update API : 한건의Document를 업데이트한다.
Delete API : 한건의Document를 삭제한다.

Document API는 한건의 Document를 처리하기 위한 기능을 제공하면 Single Document API라고 부른다고도 합니다.

하지만 실제 실무환경에서는 여러개의 Document를 관리해야하는경우도 발생합니다. 이러한경우 Multi Documenet API를 제공합니다.

Multl GET API : 다수의 Document를 조회한다.
Bulk API : 대량의 Document를 색인한다.
Delete By Query API : 다수의 Document를 삭제한다.
Update By Query API : 다수의 Document를 업데이트 한다.
Reindex API : 인덱스의 문서를 다시 색인한다.


🎈 Document 색인

전에있던 포스팅에서 생성한 인덱스에 Document를 색인해보겠습니다 (만약 DELETE 했다면 다시 생성해준다)

Document를 색인하기 위해서는 앞서 말했던것처럼 POST 메소드를 사용합니다.

movie 인덱스에 데이터를 색인해보겠습니다.

POST /movie/_doc/1
{
  "movieCd" : "1",
  "movieNm" : "반지의 제왕3 왕의 귀환",
  "movieNmEn": "The Lord Of The Rings: The Return Of The King",
  "prdtYear" : "2003",
  "repNationNm" : "뉴질랜드",
  "regGenreNm" : "판타지" 
}

# 실행 결과
{
  "_index" : "movie",
  "_type" : "_doc",
  "_id" : "1",
  "_version" : 1,
  "_seq_no" : 0,
  "_primary_term" : 1,
  "found" : true,
  "_source" : {
    "movieCd" : "1",
    "movieNm" : "반지의 제왕3 왕의 귀환",
    "movieNmEn" : "The Lord Of The Rings: The Return Of The King",
    "prdtYear" : "2003",
    "repNationNm" : "뉴질랜드",
    "regGenreNm" : "판타지"
  }
}

여기까지는 _doc의 id를 직접 준다음 저장했을때의 결과입니다.

데이터를 색인하는 방식에는 ID를 주지않고도 Document를 색인할 수 있습니다.
방식은 위와 같이 똑같이 POST 메서드를 사용하면 됩니다. 단 id를 직접 명시하지는 않습니다.

POST /movie/_doc
{
  "movieCd" : "1",
  "movieNm" : "반지의 제왕3 왕의 귀환",
  "movieNmEn": "The Lord Of The Rings: The Return Of The King",
  "prdtYear" : "2003",
  "repNationNm" : "뉴질랜드",
  "regGenreNm" : "판타지" 
}

# 생성결과 
{
  "_index" : "movie",
  "_type" : "_doc",
  "_id" : "xdjvsHcBBGvHH649uRk4",
  "_version" : 1,
  "result" : "created",
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "failed" : 0
  },
  "_seq_no" : 3,
  "_primary_term" : 1
}

대충보면 기존의 POST방식과 별다른 차이점이 없고 id만 넣지 않은것 같아 보일수도 있습니다.
하지만 생성결과를 자세히보면 다음과 같습니다. 2가지의 생성결과에서 _id를 보시면 id를 주지 않았을 경우 랜덤 UUID를 부여하여 _id값을 무작위로 생성하여 넣었습니다.

어떻게 보면 _id를 지정하지 않고 넣으면 좋을것 같지만 DB와 동기화를 시켰을경우 이미 색인되있는 Document를 업데이트할때 해당 id를 찾지 못하여 동기화에 불편을 겪을수 있습니다 ㅠㅠ

따라서 특정 규칙을 줘 id를 중복되지 않게 생성하던지, DB의 PK와 매칭시켜 색인하는것을 추천합니다!

🎈 Document 조회

다음과 같이 저장을 하였으니 Document를 조회하여 확인해보도록 하겠습니다.

Document를 조회하기 위해서는 GET 메소드를 사용합니다.

GET /movie/_doc/1

# 실행 결과
{
  "_index" : "movie",
  "_type" : "_doc",
  "_id" : "1",
  "_version" : 1,
  "_seq_no" : 0,
  "_primary_term" : 1,
  "found" : true,
  "_source" : {
    "movieCd" : "1",
    "movieNm" : "반지의 제왕3 왕의 귀환",
    "movieNmEn" : "The Lord Of The Rings: The Return Of The King",
    "prdtYear" : "2003",
    "repNationNm" : "뉴질랜드",
    "regGenreNm" : "판타지"
  }
}

위에서 POST로 생성할때 Id를 1로 하였기 때문에 _doc/1을 통해 조회합니다.


🎈 Document 삭제

Document를 색인하였으니 이번에는 삭제하는 메소드를 작성하여 삭제해 보겠습니다. 삭제시에는 인덱스의 삭제와 같이 DELETE 메소드를 사용합니다.

DELETE /movie/_doc/1

# 실행결과 
{
  "_index" : "movie",
  "_type" : "_doc",
  "_id" : "1",
  "_version" : 2,
  "result" : "deleted",
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "failed" : 0
  },
  "_seq_no" : 1,
  "_primary_term" : 1
}

실행하고 나면 result가 "deleted"로 표시된것을 볼 수 있으며 _id가 1인 Document가 성공적으로 삭제된것을 확인할 수 있습니다.


profile
Front&BaackEnd를 재미있게 공부하고싶은 개발자 YundleYundle

0개의 댓글