본문 바로가기

백엔드

[ElasticSearch] RestHighLevel Client 사용하기

참고 문서가 엘라스틱 6.x 버전의 글이거나 앞으로 삭제될 Transport Client 방법을 사용하고 있다.

엘라스틱 8.0에서 삭제될 방법보다는 권장하는 방법으로 사용하는게 나을것 같아서 삽질을 했다...

나같이 삽질하는 분이 없기를...

Spring boot를 사용하지 않았다.
현재 프로젝트가 spring-boot도 아니고 엘라스틱서치를 신규 프로젝트로 관리할 것도 아니기에 레거시 방법을 쓴다.

Spring 버전은 5.x를 추천한다.

엘라스틱서치 7.6버전을 지원하는 spring-data-elasticsearch 버전은 4.0 이후 버전부터다.
공식 홈페이지의 GA 버전은 3.2.4 버전이고 4.0 버전은 별도로 선언해야만 한다.


(2020-02-14 기준)

 

pom.xml 에 선언한다.

<repository>
    <id>spring-libs-snapshot</id>
    <name>Spring Snapshot Repository</name>
    <url>https://repo.spring.io/libs-snapshot</url>
</repository>

그리고 엘라스틱서치 관련 라이브러리도 선언한다.

<!-- https://mvnrepository.com/artifact/org.elasticsearch/elasticsearch -->
<dependency>
    <groupId>org.elasticsearch</groupId>
    <artifactId>elasticsearch</artifactId>
    <version>7.6.0</version>
</dependency>
 
<!-- https://mvnrepository.com/artifact/org.elasticsearch.client/elasticsearch-rest-client -->
<dependency>
    <groupId>org.elasticsearch.client</groupId>
    <artifactId>elasticsearch-rest-client</artifactId>
    <version>7.6.0</version>
</dependency>
    
<!-- https://mvnrepository.com/artifact/org.elasticsearch.client/elasticsearch-rest-high-level-client -->
<dependency>
    <groupId>org.elasticsearch.client</groupId>
    <artifactId>elasticsearch-rest-high-level-client</artifactId>
    <version>7.6.0</version>
</dependency>
 
<dependency>
    <groupId>org.springframework.data</groupId>
    <artifactId>spring-data-elasticsearch</artifactId>
    <version>4.0.0.BUILD-SNAPSHOT</version>
</dependency>

선언했으니 spring bean으로 등록시켜주는 설정을 하자.
file : applicationContext-elastic.xml
transport-client는 7.0부터 중요도가 낮아져 8.0부터는 삭제대상이다.
xml에 선언된 xsd를 찾아보면 elasticsearch:rest-client는 org.elasticsearch.client.RestHighLevelClient로 정의하고 있다.

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:elasticsearch="http://www.springframework.org/schema/data/elasticsearch"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
    http://www.springframework.org/schema/data/elasticsearch
    https://www.springframework.org/schema/data/elasticsearch/spring-elasticsearch.xsd">
 
    <elasticsearch:rest-client id="esClient" hosts="http://ip:9200,http://ip:9200,http://ip:9200" />
      
</beans>

web application이 잘 구동되어 위 파일을 읽어들인다면 설정은 끝.

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {
        "file:src/main/resources-common/applicationContext-security.xml",
        "file:src/main/resources-local/applicationContext-elastic.xml",
        "file:src/main/resources-local/applicationContext.xml"
        })
public class KeywordTest {
 
    @Autowired
    private RestHighLevelClient restClient;
     
    @Test
    public void search() {
        SearchRequest searchRequest = new SearchRequest("keyword_search"); // 조회하고자 하는 index
        SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
        sourceBuilder.query(QueryBuilders.matchQuery("v_type", "car")); // match 조건 1
        sourceBuilder.query(QueryBuilders.matchQuery("v_keyword", "hyundai")); // match 조건 2
        sourceBuilder.query(QueryBuilders.matchQuery("v_status", "C030"));   // match 조건 3
        sourceBuilder.sort(new FieldSortBuilder("n_sort_point").order(SortOrder.DESC));  // 정렬 조건
        sourceBuilder.from(0); // paging from
        sourceBuilder.size(2); // paging to
        searchRequest.source(sourceBuilder);
         
        try {
            SearchResponse response = restClient.search(searchRequest, RequestOptions.DEFAULT); // 조회
            System.out.println("response string \n" + response); // 응답 출력
            LinkedList<HashMap<String, Object>> list = new LinkedList<>(); // 가공
            SearchHit[] hits = response.getHits().getHits(); // 데이터만 추출
            for(SearchHit hit : hits) { 
                String str = hit.getSourceAsString();
                HashMap<String, Object> hitMap = new ObjectMapper().readValue(str, HashMap.class);
                list.add(hitMap);
            }
            System.out.println(list.size());
             
        } catch (IOException e) {
            e.printStackTrace();
        }
         
    }
}

기본 테스트는 끝.