개발 공부/Database

[검색엔진] Elasticsearch와 Spring 연동하기

journey 2021. 12. 31. 14:46
728x90

엘라스틱 서치를 스프링과 연동하는 방법

1. 스프링에서 지원하는 Spring-data-elasticsearch 모듈을 다운받아 elasticsearchRepository 인터페이스를 이용하는 법

2. 스프링에서 지원하는 Spring-data-elasticsearch 모듈을 다운받아 elasticsearchTemplate 객체를 이용하는 법

3. ES에서 지원하는 Low level REST Client 모듈을 다운받아 RestClient 클래스를 사용하는 법

4. ES에서 지원하는 High level REST Client 모듈을 다운받아 HighLevelRestClient 클래스를 사용하는 법 - 내가 사용한 방법.

High Level Rest Client 특징

High level REST Client 는 HighLevelRestClient 로 지원하며 엘라스틱 서치에 접근할 때 리퀘스트를 빌더로 만들어서 API 통신 하는 방식이다. 리스폰스도 이미 만들어진 클래스로 받아올 수 있게 지원해준다. (High-Level REST client는 엘라스틱이 밀어주고 있는 클라이언트다.)

장점

  • - 쿼리빌더를 생성해야한다.
  • - 엘라스틱이 요청/응답 DSL을 지원한다.

단점

  • 버전에 민감하지 않다.

0. 당시 개발 환경

  • 개발 Tool : jdk 11, Eclipse
  • 프레임워크 : Spring 3.x

1. Maven Configuration

Maven을 의존성 관리자로 사용하여 의존성을 구성하는 방법이다. pom.xml파일에 이 코드를 추가한다.

High level Java REST Client는 다음 아티팩트와 해당 의존성에 따라 다르다.

<!-- 추가: 엘라스틱서치 서버로 보낼 클래스 -->
<!-- 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>${es.version}</version>
</dependency>

2. Controller.java

AWS ES에서 얻은 엔드포인트 주소를 가지고 엘라스틱 검색 결과를 가져올 수 있다.

/*-- 엘라스틱 검색 결과 가져오기 --*/
String search = "";
System.out.println("search : " + keyword);

String search_addr;

// 검색 키워드가 존재 하지 않을 때, 결과 전체 출력.
if (keyword == null) {
    search_addr = "https://search-ptsdkh-....es.amazonaws.com:443/festivals/_search?pretty&size=100";
} else {
	// 검색 키워드가 존재 할 때, 키워드 검색에 따른 url로 설정하기.
    try {
        search = URLEncoder.encode(keyword, "UTF-8");
    } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
    }
    search_addr = "https://search-ptsdkh-....es.amazonaws.com:443/festivals/_search?q=" + search + "&pretty&size=100";
}

System.out.println("search_addr : " + search_addr);

URL search_url = new URL(search_addr);
HttpsURLConnection search_conn = (HttpsURLConnection) search_url.openConnection();
search_conn.setDoOutput(true);

System.out.println("search_conn : " + search_conn);

BufferedReader search_br = new BufferedReader(new InputStreamReader(search_conn.getInputStream()));
StringBuilder search_sb = new StringBuilder();
String search_res = "";

while ((search_res = search_br.readLine()) != null) {
    search_sb.append(search_res);
}

JSONObject search_obj = new JSONObject(search_sb.toString());
search_br.close();
List<FestivalsDto> searchList = festivalslistbiz.searchToFestivalsList(search_obj);
System.out.println(search_obj);

System.out.println(searchList);

/*-- 검색 결과 가져오기 끝 --*/

/*-- 검색 결과 List에 담아서 리턴하기  --*/
List<FestivalsDto> list = new ArrayList<>();

        for(int i=0; i<searchList.size(); i++) {
            searchList.get(i).setTitle(searchList.get(i).getTitle());
            list.add(searchList.get(i));

        }

        model.addAttribute("list", list);
        // model.addAttribute("keyword", keyword);


        return "searchfestivalslist";

3. Service.java

전체 검색 결과 중 내가 원하는 결과만 가져오기

@Override
public List<FestivalsDto> searchToFestivalsList(JSONObject obj) {
    List<FestivalsDto> list = new ArrayList<FestivalsDto>();
    int result = obj.getJSONObject("hits").getJSONObject("total").getInt("value");


    if(result != 0) {
        JSONArray arr = obj.getJSONObject("hits").getJSONArray("hits");

        for(int i=0; i<arr.length(); i++) {
            String title = arr.getJSONObject(i).getJSONObject("_source").getString("title");
            String addr1 = arr.getJSONObject(i).getJSONObject("_source").getString("addr1");
            String firstimage = arr.getJSONObject(i).getJSONObject("_source").getString("firstimage");
            String tel = arr.getJSONObject(i).getJSONObject("_source").getString("tel");

            FestivalsDto dto = new FestivalsDto();

            dto.setTitle(title);
            dto.setAddr1(addr1);
            dto.setFirstimage(firstimage);    
            dto.setTel(tel);

            list.add(dto);

        }
    }

    return list;
}

 

우선 이렇게 해서 엘라스틱서치를 사용하여 파이널 프로젝트 완성했다.

정말 수고하셨습니다.🙇‍♀️🙇‍♂️

'개발 공부 > Database' 카테고리의 다른 글

[MySQL] 기본 문법  (0) 2021.12.29
[검색엔진] AWS Elasticsearch Service 이용하기  (0) 2021.12.26
[검색엔진] Elasticsearch 사용법  (0) 2021.12.26
[MySQL] 쿼리 연습  (0) 2021.12.26