티스토리 뷰

Elasticsearch를 사용하는 자바 애플리케이션을 만들기 위해서는

적절한 client api를 사용하는 방법을 찾아보게 될것인데

Transport client와 Rest client를 쉽게 만나게 된다.

Transport client는 곧 삭제될 예정이기 때문에 

이 포스팅에서는 Rest client를 사용하는 코드를 적어보려고 한다.

Rest client는 High level 과 Low level Rest client가 존재한다.

(참조 : https://www.elastic.co/guide/en/elasticsearch/client/java-rest/6.8/java-rest-overview.html)

이 중에서 High Level Rest Client를 사용할 예정이다.

Elasticsearch는 6.8.8 버전을 사용하고 

gradle 프로젝트로 생성하여 사용한다.


elastic.co에서 제공하는 가이드를 따라 필요한 코드를 작성하면 되지만

필요한 부분 혹은 자주 사용할 부분만을 골라서 별도로 나만의 클래스를 생성하였다.

아래에서 설명할 코드들은 rest client api들을 종류별로 묶어서 모듈화 한것으로 보면 좋을 것 같다.

먼저, 제공하는 api들 중에서 Indices APIs 를 살펴보겠다.

인덱스 관련(색인하는 api가 아님) api들은 인덱스 생성, 인덱스 삭제, 인덱스 열기/닫기, 인덱스 존재여부, 인덱스 refresh 등의 기능을 제공한다.

 

0. dependencies 추가

//Elasticsearch
compile 'org.elasticsearch.client:elasticsearch-rest-high-level-client:6.8.8'

 

1. 인덱스 생성

 

public Boolean createIndex(String indexName, XContentBuilder settingsBuilder, XContentBuilder mappingBuilder) {

	// 인덱스생성 요청 객체
	CreateIndexRequest request = new CreateIndexRequest(indexName);
		
	return _createIndex(request, indexName, settingsBuilder, mappingBuilder);
}
    
private Boolean _createIndex(CreateIndexRequest request, String indexName, XContentBuilder settingsBuilder, XContentBuilder mappingBuilder) {
	boolean acknowledged = false;
	// 세팅 정보
	request.settings(settingsBuilder);
	// 매핑 정보
	request.mapping(mappingBuilder);
	// 인덱스 생성
	CreateIndexResponse createIndexResponse;
	try {
		createIndexResponse = client.indices().create(request, RequestOptions.DEFAULT);
		acknowledged = createIndexResponse.isAcknowledged();
	} catch (ElasticsearchException | IOException e) {
		log.error(e);
	}
		
	if(acknowledged)
		log.info(indexName + " 인덱스가 생성되었습니다.");
	else
		log.info(indexName + " 인덱스 생성을 실패했습니다.");
		return acknowledged;
}

 

 

테스트

	public String ip = "localhost";
	
	@Test
	public void createIndex() {
		ClientApi api = new ClientApi(ip);
		IndexApi index = api.getIndexApi();
		
		// settings
		XContentBuilder settingsBuilder = null;
		try {
			settingsBuilder = XContentFactory.jsonBuilder()
				.startObject()
					.field("number_of_shards", 5)
					.field("number_of_replicas", 0)

					.startObject("analysis")
						.startObject("analyzer")

							/*.startObject("arirang_index")
								.field("tokenizer", "arirang_tokenizer")
								.array("filter", new String[] { "arirang_filter", "arirang_hanja_filter", "arirang_rm_punc_filter", "joyhong_snowball" })
							.endObject()*/
						
							.startObject("nori")
								.field("tokenizer", "nori_tokenizer")
							.endObject()
							
						.endObject()
					.endObject()
				.endObject();
		} catch (IOException e) {
			e.printStackTrace();
		}

		// 매핑정보
		XContentBuilder mappingBuilder = null;
		try {
			mappingBuilder = XContentFactory.jsonBuilder()
				.startObject()
					.startObject("properties")
						.startObject("code")
							.field("type", "keyword")
							.field("store", "true")
							.field("index_options", "docs")
						.endObject()
						.startObject("title")
							.field("type", "text")
							.field("store", "true")
							.field("index_options", "docs")
						.endObject()
						.startObject("date")
							.field("type", "date")
							.field("store", "true")
							.field("index_options", "docs")
						.endObject()
					.endObject()
				.endObject();
		} catch (IOException e) {
			e.printStackTrace();
		}
					
		boolean result = index.createIndex("test", settingsBuilder, mappingBuilder);
		
		api.close();
		
		System.out.println(result);
	}

 

2. 인덱스 삭제

	public Boolean deleteIndex(String indexName) {
		boolean acknowledged = false;

		try {
			// 인덱스 삭제 요청 객체
			DeleteIndexRequest request = new DeleteIndexRequest(indexName);

			AcknowledgedResponse response = client.indices().delete(request, RequestOptions.DEFAULT);
			acknowledged = response.isAcknowledged();
		} catch (ElasticsearchException | IOException e) {
			log.error(e);
		}
		if(acknowledged)
			log.info(indexName + " 인덱스가 삭제되었습니다.");
		else
			log.info(indexName + " 인덱스 삭제를 실패했습니다.");

		return acknowledged;
	}

 

테스트

	@Test
	public void deleteIndex() {
		ClientApi api = new ClientApi(ip);
		IndexApi index = api.getIndexApi();
		boolean result = index.deleteIndex("test");
		
		api.close();
		
		System.out.println(result);
	}

 

 

3. analyze

	public List<AnalyzeToken> analyze(String indexName, String analyzer, String text) {
		AnalyzeRequest request = new AnalyzeRequest();
		request.index(indexName);
		request.text(text);  
		request.analyzer(analyzer);
		List<AnalyzeResponse.AnalyzeToken> tokens = null;
		try {
			AnalyzeResponse response = client.indices().analyze(request, RequestOptions.DEFAULT);
			tokens = response.getTokens(); 
		} catch (IOException e) {
			e.printStackTrace();
		}
		return tokens;
	}

 

테스트

	@Test
	public void analyze() {
		ClientApi api = new ClientApi(ip);
		IndexApi index = api.getIndexApi();
		List<AnalyzeToken> rstList = index.analyze("test", "nori", "엘라스틱서치 자바 클라이언트 테스트 중입니다.");
		for(AnalyzeToken token : rstList) {
			System.out.println(token.getTerm() + "\t" + token.getPosition());
		}
		
		api.close();
		
	}

 

4. 인덱스 존재 여부 확인

	public Boolean existIndex(String indexName) {
		boolean acknowledged = false;
		
		try {
			// 인덱스 존재 확인
			GetIndexRequest request = new GetIndexRequest(indexName);
			
			acknowledged = client.indices().exists(request, RequestOptions.DEFAULT);
			
		} catch (Exception e) {
			e.printStackTrace();
			return false;
		}
		
		return acknowledged;
		
	}

 

테스트

	@Test
	public void existIndex() {
		ClientApi api = new ClientApi(ip);
		IndexApi index = api.getIndexApi();
		boolean result = index.existIndex("test");
		
		api.close();
		
		System.out.println(result);
		
	}

 

5. 인덱스 Open / Close

	public Boolean openIndex(String indexName) {
		boolean acknowledged = false;

		try {
			// 인덱스 open
			OpenIndexRequest request = new OpenIndexRequest(indexName);

			OpenIndexResponse response = client.indices().open(request, RequestOptions.DEFAULT);

			acknowledged = response.isAcknowledged();
		} catch (Exception e) {
			e.printStackTrace();
			return false;
		}

		return acknowledged;
	}

	public boolean closeIndex(String indexName) {
		boolean acknowledged = false;

		try {
			// 인덱스 close
			CloseIndexRequest request = new CloseIndexRequest(indexName);

			AcknowledgedResponse response = client.indices().close(request, RequestOptions.DEFAULT);

			acknowledged = response.isAcknowledged();
		} catch (Exception e) {
			e.printStackTrace();
			return false;
		}

		return acknowledged;
	}

 

Index Apis에 대한 상세한 내용은 www.elastic.co/guide/en/elasticsearch/client/java-rest/6.8/_indices_apis.html 에서 확인이 가능하다

위에서 작성한 전체 코드는 www.github.com/joyhong85/elasticsearch-client.git 에서 확인이 가능하다

ClientApi , ClientFactory 클래스는 elasticsearch와의 연결에 대한 부분으로 중복 작성을 피하기 위해 생성한 클래스이다.

 

최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함