바로 직전에 포스팅에서 인덱스를 등록하였으니 그 다음은 바로 실제로 도큐먼트를 넣어보는것입니다.
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를 색인해보겠습니다 (만약 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를 조회하기 위해서는 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를 색인하였으니 이번에는 삭제하는 메소드를 작성하여 삭제해 보겠습니다. 삭제시에는 인덱스의 삭제와 같이 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가 성공적으로 삭제된것을 확인할 수 있습니다.