지난 시간엔 Excel Data를 Java로 읽어 오기까지 성공했다.
Java에 담겨져 있는 Excel Data의 구조를 살펴보면 다음과 같다.
{key1=value1_1, key2=value1_2, key3=value1_3,...} => Map<key, value>
{key1=value2_1, key2=value2_2, key3=value2_3,...}
{key1=value3_1, key2=value3_2, key3=value3_3,...}
...
=> ArrayList = [Map1, Map2, Map3...]
이번 포스팅에선 Java로 읽어온 Excel Data를 Elasticsearch에 색인하는 과정을 담아보겠다.
Elasticsearch와 Java를 연동하는 작업은 elastic 공식 홈페이지에 자세하게 나와있다. 일반 블로그들에 나와있는 코드들보다 더욱 설명이 잘 돼있어 많은 도움이 됐다.
Java의 데이터를 Elasticsearch로 색인하는 과정은 다음과 같다.
Java와 Elasticsearch 연동 -> Index 생성 -> Field 생성 -> Document 색인 (Bulk API) -> client 종료
과정에 맞게 우선 Java와 Elasticsearch 연동하는 방법을 알아보도록 하겠다.
Class의 도입부에 아래 코드를 작성한다.
RestHighLevelClient client = new RestHighLevelClient(
RestClient.builder(
new HttpHost("localhost", 9200, "http"),
new HttpHost("localhost", 9201, "http")));
본인은 RestHighLevelClient 방식을 사용했다.
HttpHost("server ip address", "port", "http")
본인의 설정에 맞게 이 부분을 수정해주면 된다.
client.close();
Java를 실행하면 client를 선언해줌과 동시에 연동이 된다.
주의할 점은 Class의 마지막에 client를 닫아주지 않는다면 강제로 종료하지 않는 한 빌드가 계속해서 실행중인 상태가 될 것이다.
연동은 했으니 Index를 생성해 보겠다.
client 선언부와 close 사이에 api를 작성해주면 된다.
CreateIndexRequest createIndexRequest = new CreateIndexRequest(index);
createIndexRequest.settings(Settings.builder().put("index.number_of_shards", 2).put("index.number_of_replicas", 1));
Index 생성과 함께 setting도 해주는 모습이다.
shard의 개수는 2개, replica의 개수는 1개를 생성해줬다.
Index를 생성해 주었으니 Field를 생성해보겠다.
XContentBuilder builder = XContentFactory.jsonBuilder();
builder.startObject();
{
builder.field("user", "kimchy");
builder.timeField("postDate", new Date());
builder.field("message", "trying out Elasticsearch");
}
builder.endObject();
IndexRequest indexRequest = new IndexRequest("posts", "doc", "1")
.source(builder);
필드를 생성하고
createIndexRequest.mapping("_doc", builder);
mapping을 시켜준다.
CreateIndexResponse createIndexResponse = client.indices().create(createIndexRequest, RequestOptions.DEFAULT);
위에 설정한 값들로 Index와 Field가 이 문장으로 생성이 된다.
Java의 데이터를 Elasticsearch로 색인하는 여러 방법 중 사용한 api는 Bulk API이다. 다음 포스팅에서 Bulk API를 다루도록 하겠다.