한번에 많은 document를 index에 올리려면 어떻게 해야할까?
_bulk 옵션을 이용해야한다.
따라서 이번에는 REST 쿼리와 JSON 형식을 사용하여 많은 문서를 한 번에 가져오는
방법을 살펴보겠다.
먼저 우리는 홈 디렉터리에서 다음과 같은 내용을 갖는 파일을 만들어야한다.
{ "create" : { "_index": "movies", "_id": "135569" } }
{ "id": "135569", "title": "Star Trek Beyond", "year": 2016, "genre": ["Action", "Adventure", "Sci-Fi"] }
{ "create" : { "_index": "movies", "_id": "122886" } }
{ "id": "122886", "title": "Star Wars: Episode VII", "year": 2015, "genre": ["Action", "Adventure", "Fantasy", "Sci-Fi"] }
{ "create" : { "_index": "movies", "_id": "109487" } }
{ "id": "109487", "title": "Interstellar", "year": 2014, "genre": ["IMAX", "Sci-Fi"] }
{ "create" : { "_index": "movies", "_id": "58559" } }
{ "id": "58559", "title": "Dark Knight", "year": 1959, "genre": ["Horror", "Sci-Fi"] }
포괄적인 하나의 JSON 요청이 아닌 각 줄을 이런 식으로 분리하는 이유는 따로있다. 이전 강좌를 통해 Elasticsearch는 모든 특정 문서를 주어진 샤드로 해시한다는 것을 기억할 것이다.
Elasticsearch는 개별 문서를 한 번에 하나씩 처리한다.
예로, 각 줄을 읽으며 영화 ID 1355569를 어떤 샤드로 매핑해야 할지를 정한다.
그다음 클러스터 내의 그 샤드에 정보를 넘겨준다.
그리고 다음 줄을 처리하며 이번에는 다른 샤드로 보내고, 다음에는 또 다른 노드로 넘긴다.
Elasticsearch 서버에 어떤 문서를 어떤 샤드로 보내서 처리할지 한 번에 전부 다 처리하지 않고 한 번에 한 줄씩 전달한다. 이것이 이러한 양식의 의도이다.
하지만 우리는 이것을 일일이 입력할 필요는 없다.(다행..)
위 명령어를 실행하면 아까 보여준 데이터가 담긴 파일을 다운로드 받을 수 있다.
cat movies.json
또 위와 같은 명령어를 통해 다운 받은 파일의 명령어를 확인할 수 있다.
이제 터미널에서 아래 명령어를 입력해 벌크 작업을 수행하면 된다.
curl -XPUT 127.0.0.1:9200/_bulk?pretty --data-binary @movies.json
이후 아래 명령어를 통해 많은 문서들이 색인에 잘 들어갔는지 확인하면 끝이다.
curl -XGET 127.0.0.1:9200/movies/_search?pretty