[Elasticsearch] 데이터 집어넣기 (Document)
인덱스와 데이터 관련 구조에 대해 정리해보자면, 크게 인덱스와 타입, 도큐먼트로 나뉜다.
[인덱스]는 가장 뼈대가 되는 기본구조다. 데이터베이스에 비유하면 데이터베이스 자체라 할 수 있겠다.
그리고 [타입]은 그 안에서 매핑 데이터를 정의하는 것을 말한다. 데이터베이스에 비유하면 테이블에 빗댈 수 있다.
이건 따로 지정하지 않고 사용할 수도 있다.
타입을 사용하면 하나의 인덱스에 여러가지 구조를 구겨넣을 수 있는데, 그건 나중에 다루겠다.
[도큐먼트]는 실제로 들어가는 데이터 하나하나를 말한다.
도큐먼트 삽입 (단건)
데이터를 집어넣는건 다음과 같이 할 수 있다.
"POST /_doc"에 매핑에 정의된대로 데이터를 집어넣으면 된다.
만약 타입이 있을 경우 _doc 자리에 타입을 넣어주면 된다.

그럼 이렇게 들어간다.

그럼 이렇게 데이터가 들어간 것을 확인할 수 있다.

도큐먼트 삽입 (중복방지, 단건)


도큐먼트 대량삽입
근데 엘라스틱서치에 데이터를 동기화할때 이렇게 찔끔찔끔 넣는일은 거의 없다.
수천수만개씩 대량으로 집어넣지.
대량삽입을 하려면 "POST /인덱스명/_bulk" API를 사용하면 된다.
https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-bulk.html
이건 굉장히 특이하게도 x-ndjson이라는 포맷으로 데이터를 받는다.
json을 개행으로 구분해서 여러개 받는 독특한 포맷인데, 그냥 json 배열을 써도 될걸 왜 굳이 이런걸 쓰는지는 잘 모르겠다.
일반적인 사용법은 위와 같이 작업의 종류를 json 한개로 정의해놓고, 그 작업으로 넣을 데이터를 json으로 또 늘어놓는 식이다.
{ "작업 종류" : { ...식별자 등 설정값 } }
{ ...데이터... }
index는 저 _id라는 고유값으로 upsert를 해주는 기능이고, 이외에도 update, create, delete 등이 있으나 웬만하면 index만 해도 충분할 것이다.
저렇게 해서 쏘면

잘 들어갈 것이다.

대충 이런식으로 넣으면 된다.
API 직접 쏘는게 불편하다면 이런 껍질 씌워놓은 라이브러리를 써도 되는데
https://www.npmjs.com/package/@elastic/elasticsearch
이건 타임아웃이나 body-length 제한같은걸 수정할 수 있는 옵션이 없어서 초대형 데이터 전송은 좀 불편하더라.
편한대로 쓰면 된다.
로그스태시? BEATS?
보통 엘라스틱서치를 쓴다고 하면 로그스태시로 이러한 데이터 동기화 작업을 자동화하는 게 기본처럼 되어있다.
하지만 내 경험상.. 별로 추천하고싶은 방법은 아니다.
커스텀하는 것도 한계가 있고 성능을 고려하지 않고 막 날리더라.
그냥 직접 Bulk API 쏘는거 프로그램 하나 짜서 주기적으로 돌리는걸 추천한다.
그렇게 어렵지도 않다.