본문 바로가기
DB

[실전] Spring Data Elasticsearch로 구현하는 '한글 자동 완성' 검색 시스템

by 공부 안하고 싶은 사람 2026. 3. 5.
반응형
Search Implementation Series 02

이론을 넘어 실전으로!
Elasticsearch 자동 완성 구현하기

 

안녕하세요, code-resting입니다. 지난 시간에는 Elasticsearch의 역색인 원리를 살펴보았습니다. 오늘은 이를 스프링 부트에 연동하여, 한국어 검색에서 필수적인 Nori 분석기 설정법과 Edge n-gram을 활용한 '검색 자동 완성' 기능을 구현해 보겠습니다.

1. 의존성 설정 및 도메인 모델링

Spring Data Elasticsearch를 사용하면 익숙한 Repository 패턴으로 ES에 접근할 수 있습니다.

// build.gradle
dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-data-elasticsearch'
}

검색에 최적화된 엔티티 설정을 위해 @Setting@Mapping 어노테이션을 활용합니다. 여기서 Nori 분석기를 지정하는 것이 핵심입니다.

@Document(indexName = "products")
@Setting(settingPath = "elasticsearch/settings.json")
public class ProductIndex {
    @Id
    private String id;

    @Field(type = FieldType.Text, analyzer = "nori_analyzer")
    private String name;

    @Field(type = FieldType.Keyword)
    private String category;
}

2. Nori 분석기 및 Edge n-gram 설정

자동 완성(Search-as-you-type)을 구현하려면 단어의 앞부분만 입력해도 검색이 되어야 합니다. 이를 위해 Edge n-gram 토큰 필터를 설정합니다.

// elasticsearch/settings.json
{
  "analysis": {
    "analyzer": {
      "nori_analyzer": {
        "tokenizer": "nori_tokenizer",
        "filter": ["lowercase", "edge_ngram_filter"]
      }
    },
    "filter": {
      "edge_ngram_filter": {
        "type": "edge_ngram",
        "min_gram": 1,
        "max_gram": 20
      }
    }
  }
}

3. 검색 로직 구현 (ElasticsearchOperations)

단순 매칭이 아닌 MatchQuery를 통해 형태소 분석이 적용된 검색을 수행합니다.

public List<ProductIndex> autoComplete(String keyword) {
    NativeQuery query = NativeQuery.builder()
            .withQuery(q -> q.match(m -> m.field("name").query(keyword)))
            .withPageable(PageRequest.of(0, 10))
            .build();

    SearchHits<ProductIndex> hits = elasticsearchOperations.search(query, ProductIndex.class);
    return hits.getSearchHits().stream().map(SearchHit::getContent).toList();
}

💡 실무 적용 포인트

  • Nori Plugin 설치: ES 서버에 analysis-nori 플러그인이 미리 설치되어 있어야 합니다.
  • 인덱스 재생성: Analyzer 설정이 변경되면 기존 인덱스를 삭제하고 데이터를 다시 부어야(Reindexing) 적용됩니다.
  • RDBMS 동기화: 실제 운영에서는 DB에 저장할 때 ES에도 데이터를 넣어주는 이벤트 기반 동기화 방식이 주로 쓰입니다.

💡 마치며

이제 "맥북"만 입력해도 "맥북 프로 16인치", "맥북 에어 M3" 등이 즉시 검색되는 고성능 검색 기능을 갖게 되었습니다. RDBMS의 한계를 검색 엔진으로 보완하는 아키텍처는 2026년 백엔드 개발자의 실력을 가르는 중요한 기준입니다.

© 2026 code-resting. All rights reserved.

반응형

댓글