Elastic Stack/Elastic Search

Spring Boot - ElasticSearch RestHighLevelClient Index관련 개발하기 (rest high level client CRUD)

super728 2021. 11. 12. 21:35

1. 인덱스 생성하기

CreateIndexRequest request = new CreateIndexRequest("TestIndex"); // 인덱스 명

// mapping 설정
Map<String,Object> message = new HashMap<>();
message.put("type", "text");
Map<String,Object> properties = new HashMap<>();
properties.put("message", message);
Map<String,Object> mapping = new HashMap<>();
mapping.put("properties", properties);
request.mapping(mapping);

// 인덱스 생성
client.indices().create(request, RequestOptions.DEFAULT);

여기서 mapping 이란?

mapping은 관계형 데이터베이스(RBDMS)의 schema와 비슷한 개념으로, Elasticsearch의 index에 들어가는 데이터의 타입을 정의하는 것이다. 물론 그 외에도 수많은 기능을 설정하는 기능이 있지만 결국 mapping의 가장 중요한 역할은 데이터의 유형을 정의하고, 그 데이터를 어떻게 index 하는지 결정하는 것이다.

출처: https://dgkim5360.tistory.com/entry/mapping-management-of-elasticsearch-index [개발새발로그]

 

Elasticsearch 초보의 mapping 관리

Elasticsearch는 분산 시스템을 기본적으로 지원하는 전문 검색(full-text search) 오픈 소스 프로젝트로, "검색"을 쉽게 접근할 수 있게 해주는 강력한 도구이다. 나중에 전반적으로 설명할 기회가 있다

dgkim5360.tistory.com

저도 매핑에 대한 개념 없이 무조건 인덱스 만들고 데이터를 집어넣는 식으로 해서 지금까지 개발을 진행해 왔었는데, 이번 기회에 찾아볼 수 있었습니다 ㅎㅎ

 

결과 확인

els를 연동해놓은 kibana에서 결과를 확인할 수 있습니다. mappings 부분에 정상적으로 messsage의 type 이 text로 설정되었습니다. 

 

2. 인덱스 삭제하기

DeleteIndexRequest request = new DeleteIndexRequest("testindex");
client.indices().delete(request, RequestOptions.DEFAULT);

결과 확인

방금 만들었던 testindex가 삭제되었습니다. 

3. 문서 추가

방금 삭제하였던 testindex를 다시 생성하고 진행합니다. 

IndexRequest request = new IndexRequest("testindex");
Map<String,Object> doc = new HashMap<>();
doc.put("message", "테스트입니다.");
request.source(doc);
client.index(request, RequestOptions.DEFAULT);

결과 확인

kibana로 indexpattern에 testindex를 등록하고 discover로 이동하여 결과를 확인할 수 있습니다. indexpattern을 등록하는 방법은

2021.09.24 - [Elastic Stack/Logstash] - MariaDB-Logstash-elasticsearch 연동하기

 

MariaDB-Logstash-elasticsearch 연동하기

Logstash로 MariaDB를 접속하여 데이터를 수집하고 elasticsearch에 연동하는 방법입니다. 1. Logstash conf 파일 작성 input { jdbc { jdbc_driver_library => "C:/dev/logstash-7.14.1/lib/mariadb-java-client-..

super-devstory.tistory.com

에서 확인하실 수 있습니다. 

저는 두 번 넣었더니 두 번 들어갔네요 정상적으로 인덱스가 등록된 것을 확인할 수 있습니다. 

4. 문서 조회

GetRequest request = new GetRequest("testindex", "Kf8NFH0BgwgVRf4nZwZL"); // 인덱스명, _id
GetResponse response = client.get(request, RequestOptions.DEFAULT);
if(response.isExists()) { // 문서있음
	Map<String,Object> sourceAsMap = response.getSourceAsMap();
	log.debug(sourceAsMap.toString());
} else { // 문서없음
	log.debug("문서 없음!!");
}

_id는 위에 확인한 아이디 값으로 조회를 시도해보겠습니다. 문서가 있을 때와 없을 때 두 가지 경우 모두 핸들링 가능합니다. 

결과 확인

소스에서도 보시면 아시다시피 저는 결과를 콘솔에 로그로 출력하였습니다. 

5. 문서 삭제

DeleteRequest request = new DeleteRequest("testindex","Kf8NFH0BgwgVRf4nZwZL");
client.delete(request, RequestOptions.DEFAULT);

방금 조회한 _id값을 가진 문서를 삭제합니다. 

결과 확인

kibana를 통해 결과를 확인해봅니다. 

등록해 놓은 2개의 문서 중 Kf8NFH0BgwgVRf4nZwZL 라는 아이디를 가진 문서가 정상적으로 삭제되었습니다. 

6. 문서 수정

UpdateRequest request = new UpdateRequest("testindex","zv8NFH0BgwgVRf4n8gY6");
Map<String,Object> updatedDoc = new HashMap<>();
updatedDoc.put("message", "업데이트된 문서입니다.");
request.doc(updatedDoc);
client.update(request, RequestOptions.DEFAULT);

남아있는 _id의 값이 zv8NFH0BgwgVRf4n8gY6 인 문서의 message를 수정합니다. 

결과 확인

정상적으로 수정되었습니다.