-
자바로 엘라스틱서치(Elasticsearch) 데이터 보내기 (단건,다건) Java to ELkAPi 2024. 1. 14. 20:33반응형
웹서비스중인 사이트의 로그를 ELK(Elasticsearch Kibana)로 보기 위해
1건 전송과 한번에 여러건을 전송하는 일이 생겼다. // java rest APi
삽질의 결과를 토대로 포스팅을 한다.
※ ELK 기 본적으로 헤더에 Basic 인증정보를 넣어 API통신을 해야한다. // "아이디:비밀번호" BASE64 인코딩을 해서 보냄.
1. 단건 (1건) 보내기
- _doc api 이용
- method : POST
- API주소 : https://엘라스틱서치주소/인덱스명/_doc
- Java RestTemplate 클래스 사용
- 전송 형식 (Body)
{ "field1" : "value1" , "field2" : "value2" , "field3" : "value3" }
일반적인 json 형태로 보내면된다.
api주소의 중간 경로에는 반드시 인덱스명이 필요하다.
전체소스
HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_JSON); headers.setBasicAuth("엘라스틱서치 로그안 이이디", "엘라스틱서치 로그안 비밀번호"); RestTemplate restTemplate = new RestTemplate(); ElasticSearchReqVo reqVo = new ElasticSearchReqVo(); //보낼데이터가 이미 set됐다고 가정 // HTTP POST 요청 및 응답 처리 ResponseEntity<String> result = restTemplate.exchange( "API주소" , HttpMethod.POST , new HttpEntity<>(reqVo, headers) , String.class );
2. 다건 (멀티) 보내기
- _bulk api 이용
- method : POST
- API주소 : https://엘라스틱서치주소/_bulk
- Java RestTemplate 클래스 사용
- 만약 3건을 한번에 보낼 때 전송 형식 (body)
{"index": {"_index": 인덱스명} } { "field1" : "value1" , "field2" : "value2" , "field3" : "value3"} {"index": {"_index": 인덱스명} } { "field1" : "value1" , "field2" : "value2" , "field3" : "value3"} {"index": {"_index": 인덱스명} } { "field1" : "value1" , "field2" : "value2" , "field3" : "value3"}
전송규격을 보면 배열의 형태도 아니고 콤마 구분자도 없고 이상한 형태다.
이것 때문에 삽질을 많이했다. 이런식으로 데이터를 보내본적이 없기 때문 ㅋ;
body안에 인덱스명이 있어야한다. 인덱스영역의 중괄호, 데이터영역의 중괄호 이 2중괄호가 1개의 데이터를 전송한다.
마지막엔 꼭 \n을 2번 해야한다.
전체소스
HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_JSON); headers.setBasicAuth("엘라스틱서치 로그안 이이디", "엘라스틱서치 로그안 비밀번호"); RestTemplate restTemplate = new RestTemplate(); ElasticSearchReqVo reqVo = new ElasticSearchReqVo(); //보낼데이터가 이미 set됐다고 가정 StringBuilder bulkRequestBody = new StringBuilder(); ObjectMapper objectMapper = new ObjectMapper(); //bulk 형태로 보내는 전송규격으로 변경한다. bulkRequestBody.append("{ \"index\" : { \"_index\" : \"" + "인덱스명" + "\" } }\n"); bulkRequestBody.append(objectMapper.writeValueAsString(reqVo)).append("\n\n"); ResponseEntity<String> result = restTemplate.exchange( "API주소" , HttpMethod.POST , new HttpEntity<>(bulkRequestBody.toString(), headers) , String.class );
반응형'APi' 카테고리의 다른 글
스웨거(Swagger) 3.0 오류 Failed to start bean 'documentationPluginsBootstrapper'; nested exception is java.lang.NullPointerException" (0) 2023.08.18 초간단 웹 <> 페이스북 로그인 연동하기 (0) 2017.12.16 자바(java) 구글 메일전송(SMTP) 사용하기 (0) 2017.10.06 [javascript] 유튜브(youtube) api사용하여 플레이리스트 뿌리기 (0) 2017.10.06