개발/ElasticSearch

ElasticSearch Java에서 사용하기

숭늉.K 2019. 12. 12. 17:03

Java에서 ElasticSearch를 컨트롤 할수있게 JavaAPI를 제공한다.
Elastic 가이드에서 쉽고 친절하게 설명이 되어 있고, 라이브러리 또한 제공한다. 

 

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

 

Search API | Java REST Client [7.6] | Elastic

The SearchRequest is used for any operation that has to do with searching documents, aggregations, suggestions and also offers ways of requesting highlighting on the resulting documents. In its most basic form, we can add a query to the request: SearchRequ

www.elastic.co

 

 

Maven 프로젝트 경험이 있다면, 쉽게 따라 할 수 있는데, 

정말 어이없게도 pom.xml에 아래 dependency만 추가해주면 모든 준비가 끝난다.

<dependency>
  <groupId>org.elasticsearch</groupId>
  <artifactId>elasticsearch</artifactId>
  <version>6.8.1</version>
  <scope>provided</scope>
</dependency>
<dependency>
  <groupId>org.elasticsearch.client</groupId>
  <artifactId>elasticsearch-rest-client</artifactId>
  <version>6.8.1</version>
</dependency>

 

Elastic에서 제공하는 클라이언트는 High Level Client와 Low Level Client 가 있다.

입문할 때는 개인적으로는 Low Level Client를 추천한다. 쉽고 직관적이다.

 

간단하게 비교하자면

High Level Client는 함수형으로 Builder Class를 사용하여 쿼리를 제작해야 하고, 

Low Level Client는 Json 쿼리를 String 형으로 그대로 사용이 가능하다.

Elastic Stack에는 Kibana라는 UI 툴이 제공되는데, 개발 툴을 이용하면 더욱 쉽다.

 

 

<High Level Client 사용 예>

SearchRequest searchRequest = new SearchRequest(indexName); 
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder(); 
sourceBuilder.from(0); 
sourceBuilder.size(15); 

QueryBuilder scoreQuery = QueryBuilders.queryStringQuery("text:엘라스틱서치").boost(5); 
QueryBuilder filterQuery = QueryBuilders.boolQuery().filter(QueryBuilders.matchQuery("date", today)); 
sourceBuilder.query(QueryBuilders.boolQuery().must(scoreQuery).filter(filterQuery)); 

searchRequest.source(sourceBuilder); SearchResponse result = client.search(searchRequest); 
System.out.println(result.toString()); 

 

<Low Level Client 사용 예시>

Map<String, String> params = Collections.singletonMap("pretty", "true");
query = "{" + 
		" \"from\": 0, " + 
		" \"size\": 15," + 
		" \"query\": {" + 
		"   \"bool\": {" + 
		"     \"must\": [" + 
		"       {" + 
		"         \"query_string\": {" + 
		"           \"query\": \"text:엘라스틱서치\"" + 
		"         }" + 
		"       }" + 
		"     ]," + 
		"     \"filter\": {" + 
		"       \"query_string\": {" + 
		"         \"query\": \"date:2019-01-01\"" + 
		"       }" + 
		"     }" + 
		"   }" + 
		" }" + 
		"}";
HttpEntity entity = new NStringEntity(query, ContentType.APPLICATION_JSON);
Response response = restClient.performRequest("GET", "/myIndex/_search", params, entity);
String responseBody = EntityUtils.toString(response.getEntity());

 

두개의 방식에 서로의 장단점이 있어, 프로젝트 기능의 특성에 맞게끔 선택하면 된다. 

참고로, High Level에는 Low Level의 기능을 모두 가지고 있다.