Java 에서 Elastic Search 사용하기 - 1. Get Request

작성: 2021.06.07

수정: 2021.06.07

읽는시간: 00 분

Data/Search Engine

반응형
	<!-- Elastic Search -->
	<dependency>
		<groupId>org.elasticsearch</groupId>
		<artifactId>elasticsearch</artifactId>
		<version>7.12.1</version>
	</dependency>
	<dependency>
		<groupId>org.elasticsearch.client</groupId>
		<artifactId>elasticsearch-rest-high-level-client</artifactId>
		<version>7.12.1</version>
	</dependency>

 

Elastic Search client로는 High level client 와 Low level client가 있습니다.

low level client는 버전에 영향을 받지 않고 유연하지만, 사용하기 좀 더 어렵습니다.

High level client는 Low level client를 한번 추상화 해서 사용합니다.

 

https://www.elastic.co/guide/en/elasticsearch/client/java-rest/master/java-rest-high.html

 

Java High Level REST Client | Java REST Client [master] | Elastic

The Java High Level REST Client works on top of the Java Low Level REST client. Its main goal is to expose API specific methods, that accept request objects as an argument and return response objects, so that request marshalling and response un-marshalling

www.elastic.co

 

처음 사용을 해보기 때문에, 좀 더 사용하기 쉬운 High level client를 사용해 보겠습니다.

		String hostname = localhost;
		int port = 9200;
		String scheme = "http";
		HttpHost host = new HttpHost(hostname, port, scheme);
		RestClientBuilder restClientBuilder = RestClient.builder(host);
		RestHighLevelClient client = new RestHighLevelClient(restClientBuilder);​

RestHighLevelClient 객체를 하나 만들어 보려고 하니, RestClientBuilder를 달라고 하고

Builder를 만들려고 하니 HttpHost를 달라 그러고

HttpHost를 만들려 하니 hostname, port, schme ( 기본 : http) 를 달라고 하네요. 

일단 달라는거 다 줘서 client 객체를 만들어 봅니다.

 

이제 만든 client 객체로 get 요청을 보내보려고 합니다. GetRequest 객체와 RequestOptions 객체를 필요로 합니다.

GetRequest 객체를 먼저 만들어 보겠습니다. 

ndex, type, id를 요구하는 생성자는 아쉽게도 Deprecated 되어 있습니다.

 

index, id 로만 생성 해봐야 겠습니다. 둘 다 String 입니다.

RequestOptions는 DEFAULT 를 사용해 보겠습니다.

IOException을 처리하라고 하는데, 일단 Throw 해보겠습니다.

 

자 이제 Return 타입을 확인 해 보니 response 입니다.

뭔지 잘 모르겠지만 우리가 잘 아는 만능 출력기에 넣어 돌려보겠습니다.

오오! 전에 등록해두었던 값을 잘 불러 옵니다...

아직 엘라스틱서치에 데이터를 넣어두지 않았다면 아래 링크를 확인해서 쉽게 먼저 넣어 보세요. 물론 지금 준비한 RestClientBuilder를 활용해서 post 요청으로 넣을 수도 있겠네요.

https://shanepark.tistory.com/109?category=1203908 

 

Windows) Elasticsearch 2) Postman 설치하기 및 CRUD 예제

ElasticSearch를 활용하기 위해 Tool 을 설치합니다. Oracle에는 SQL Developer MYSQL에는 Sequel Pro MongoDB는 Robo 3T 가 있죠 이번에는 Api 를 테스트하기 위해 Postman을 설치할 예정입니다. https://www.pos..

shanepark.tistory.com

 

이제 response를 어떻게 활용할 수 있는지 code assist를 받아봤습니다.

getSource 도 있고 getSourceAsMap 도 있는데, 둘이 딱히 차이가 있어 보이진 않습니다.

map을 만들어 출력 해 보니 깔끔하게 제가 입력한 데이터만 나옵니다. 이상입니다. 

제가 작성한 샘플 코드를 첨부하며 글 마치겠습니다.

 

package best.gaia.issue.service;

import java.io.IOException;
import java.util.Map;

import org.apache.http.HttpHost;
import org.elasticsearch.action.get.GetRequest;
import org.elasticsearch.action.get.GetResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestClientBuilder;
import org.elasticsearch.client.RestHighLevelClient;

public class ElasticTest {
	public static void main(String[] args) throws IOException {
		
		String hostname = "localhost";
		int port = 9200;
		HttpHost host = new HttpHost(hostname, port);
		RestClientBuilder restClientBuilder = RestClient.builder(host);
		RestHighLevelClient client = new RestHighLevelClient(restClientBuilder);
		
		String index = "gaia";
		String id = "1";
		GetRequest getRequest = new GetRequest(index, id);
		RequestOptions options = RequestOptions.DEFAULT;
		
		GetResponse response = client.get(getRequest, options);
		
		Map<String,Object> map = response.getSourceAsMap();
		System.out.println(map);
		
	}
}

 

같은 방법으로 Post, Put, Delete 모두 사용 하면 어렵지 않게 사용 할 수 있을 것 같습니다.

 

이제 위의 코드를 모듈화 해서 유틸 처럼 사용 해 보려고 합니다.

중간 프로젝트 할때쯤 배웠던 싱글톤 패턴을 기억해내며 만들어 보았습니다.

package best.gaia.utils;

import java.io.IOException;
import java.io.Reader;
import java.util.Map;
import java.util.Properties;

import org.apache.http.HttpHost;
import org.elasticsearch.action.get.GetRequest;
import org.elasticsearch.action.get.GetResponse;
import org.elasticsearch.action.index.IndexRequest;
import org.elasticsearch.action.index.IndexResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestClientBuilder;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.common.xcontent.XContentType;

import com.ibatis.common.resources.Resources;


public class ElasticUtil {
	private static ElasticUtil self;
	private static RestHighLevelClient client;
	
	private ElasticUtil() throws IOException {
        Properties properties = new Properties();
        Reader reader = Resources.getResourceAsReader("best/gaia/db/dbinfo.properties");
        properties.load(reader);
        String hostname = properties.getProperty("el.url");
        int port = Integer.parseInt(properties.getProperty("el.port"));
        HttpHost host = new HttpHost(hostname, port);
        RestClientBuilder restClientBuilder = RestClient.builder(host);
        client = new RestHighLevelClient(restClientBuilder);
	};
	
	public static ElasticUtil getInstance() throws IOException {
		if(self == null)
			self = new ElasticUtil();
		return self;
	}
	
	public Map<String,Object> getReponse(String index, String id) {
		GetResponse response = null; 
		
		GetRequest getRequest = new GetRequest(index, id);
		RequestOptions options = RequestOptions.DEFAULT;
		try {
		response = client.get(getRequest, options);
		} catch (IOException e) {
			e.printStackTrace();
		}
		
		return response.getSourceAsMap();
	}
}

이미 프로젝트에서 사용중인 dbinfo.properties 파일이 있고, 이미 gitignore에 추가 한 상태여서 해당 파일에 Elastic Search 접속 정보도 저장했습니다. 각각 el.url과 el.port 로 저장 한 뒤 불러와서 생성자 호출시에 해당 정보들을 바탕으로 high level client 객체를 만들어줍니다.

첫번째로 만든 함수는 getResponse 인데요,  위에 썼던 코드들을 이용해 index와 id 를 인자로 받아 해당하는 response를 map 으로 만들어서 내어 주도록 만들었습니다.

String index = "gaia";
String id = "1";

ElasticUtil elastic = ElasticUtil.getInstance();

Map<String,Object> map = elastic.getReponse(index,id);

호출할때는 위와 같이 호출해서 사용하면 index와 id에 대한 response를 map 으로 받아 올 수 있습니다.

이상입니다.

 

 

반응형