스프링 부트와 엘라스틱서치를 활용한 검색 엔진 구축하기

스프링 부트와 엘라스틱서치를 소개합니다

스프링 부트는 스프링 프레임워크의 확장판으로써 빠르고 쉬운 웹 애플리케이션 개발을 위해 만들어졌습니다. 이에 반해 엘라스틱서치는 대용량 데이터 검색 엔진으로써 강력한 검색 기능을 제공합니다. 이번 글에서는 스프링 부트와 엘라스틱서치를 활용하여 검색 엔진을 구축하는 방법에 대해 알아보겠습니다.

검색 엔진 구축을 위한 스프링 부트와 엘라스틱서치 연동 방법

스프링 부트와 엘라스틱서치를 연동하기 위해서는 먼저 스프링 부트에서 엘라스틱서치를 사용할 수 있도록 설정해야 합니다. 이를 위해서는 spring-boot-starter-data-elasticsearch 의존성을 추가해야 합니다.


    org.springframework.boot
    spring-boot-starter-data-elasticsearch

다음으로 스프링 부트의 application.properties 파일에 엘라스틱서치 호스트와 포트를 설정해줍니다.

spring.data.elasticsearch.cluster-nodes=localhost:9300

이제 스프링 부트와 엘라스틱서치를 연동할 수 있게 되었습니다. 다음으로는 엘라스틱서치에서 데이터를 인덱싱하고 검색하는 방법에 대해 알아보겠습니다.

엘라스틱서치를 활용한 데이터 인덱싱과 검색 구현

엘라스틱서치에서 데이터를 인덱싱하기 위해서는 먼저 인덱스를 생성해야 합니다. 인덱스는 데이터를 저장하는 공간으로써, 동일한 유형의 데이터를 하나의 인덱스에 저장합니다.

@Document(indexName = "books")
public class Book {
    @Id
    private String id;
    private String title;
    private String author;
    private String description;
    // getters, setters, toString methods
}

위와 같이 @Document 애노테이션을 사용하여 엘라스틱서치 인덱스 이름을 정의하고, 필드에 @Id 애노테이션을 사용하여 ID를 정의합니다.

다음으로는 데이터를 인덱싱하는 방법에 대해 알아보겠습니다.

@Autowired
private ElasticsearchOperations elasticsearchOperations;

public void index(Book book) {
    IndexQuery indexQuery = new IndexQueryBuilder()
            .withId(book.getId())
            .withObject(book)
            .build();
    elasticsearchOperations.index(indexQuery);
}

위 코드에서는 elasticsearchOperations 빈을 주입받아 IndexQueryBuilder 를 사용하여 인덱싱할 데이터를 설정한 후 elasticsearchOperations.index() 메서드를 호출하여 데이터를 인덱싱합니다.

인덱싱된 데이터를 검색하기 위해서는 ElasticsearchOperations 빈을 주입받아 NativeSearchQueryBuilder 를 사용하여 검색 쿼리를 작성하고 elasticsearchOperations.search() 메서드를 호출합니다.

@Autowired
private ElasticsearchOperations elasticsearchOperations;

public List search(String query) {
    NativeSearchQuery searchQuery = new NativeSearchQueryBuilder()
            .withQuery(QueryBuilders.multiMatchQuery(query, "title", "author", "description"))
            .build();
    return elasticsearchOperations.search(searchQuery, Book.class).getSearchHits()
            .stream()
            .map(SearchHit::getContent)
            .collect(Collectors.toList());
}

위 코드에서는 NativeSearchQueryBuilder 를 사용하여 검색 쿼리를 작성한 후 elasticsearchOperations.search() 메서드를 호출하여 검색 결과를 가져옵니다. 검색 결과는 SearchHits 에 저장되어 있으며, 이를 getContent() 메서드를 이용하여 검색 결과를 가져옵니다.

검색 결과를 웹 애플리케이션에서 보여주는 방법

검색 결과를 웹 애플리케이션에서 보여주기 위해서는 먼저 검색 폼과 검색 결과를 보여줄 페이지를 만들어야 합니다. 검색 폼은 다음과 같이 만들 수 있습니다.


    검색

위 코드에서는 GET 방식으로 /search 경로로 검색어를 전송하는 검색 폼을 만들었습니다.

다음은 검색 결과를 보여줄 페이지를 만드는 방법입니다.


        제목
        저자
        설명

위 코드에서는 Thymeleaf 템플릿 엔진을 사용하여 검색 결과를 보여주는 템플릿을 작성했습니다. th:each 속성을 사용하여 검색 결과를 반복하며, th:text 속성을 사용하여 각 필드 값을 출력합니다.

이제 검색어를 전송하면 검색 결과를 보여주는 웹 페이지를 만들 수 있게 되었습니다.

결론

이번 글에서는 스프링 부트와 엘라스틱서치를 활용하여 검색 엔진을 구축하는 방법에 대해 알아보았습니다. 스프링 부트를 사용하면 빠르고 쉽게 웹 애플리케이션을 개발할 수 있으며, 엘라스틱서치를 사용하면 대용량 데이터를 빠르고 강력한 검색 기능으로 검색할 수 있습니다. 이를 활용하여 강력한 검색 엔진을 만들어보세요.