JSCODE Logo
프로그래밍 과외블로그후기멘토진
회사명 : JSCODE대표 : 박재성사업자 등록번호 : 244-22-01557통신판매업 : 제 2023-인천미추홀-0381 호
학원 명칭 : 제이에스코드(JSCODE)원격학원학원설립ㆍ운영 등록번호 : 제6063호

서울특별시 구로구 경인로 20가길 11(오류동, 아델리아)

Copyright ⓒ 2025 JSCODE - 최상위 현업 개발자들의 프로그래밍 교육 All rights reserved.

이용약관개인정보처리방침
← 블로그 목록으로 돌아가기

검색 키워드를 일부 입력했을 때 검색어를 추천해주는 기능 (자동 완성 기능)

JSCODE 박재성
JSCODE 박재성
2025-12-06
author
JSCODE 박재성
category
Elasticsearch
createdAt
Dec 6, 2025
series
실전에서 바로 써먹는 Elasticsearch 입문 (검색 최적화편)
slug
autocomplete-feature
type
post
updatedAt
Dec 6, 2025 04:48 AM

✅ 검색 키워드를 일부 입력했을 때 검색어를 추천해주는 기능 (자동 완성 기능)

notion image
쿠팡 서비스에 들어가서 검색 창에 글자를 입력하면 글자에 해당하는 검색어를 추천해준다. 자동 완성 기능을 구현하는 방법에는 정말 다양한 방법이 존재한다. 그 중에서 가성비가 좋은 방법인 search_as_you_type이라는 걸 활용해서 구현하는 방법을 배워보자.
 
 

✅ search_as_you_type이란?

  • Elasticsearch에서 자동 완성 기능을 쉽게 구현할 수 있게 설계된 데이터 타입이다.
  • text 타입처럼 애널라이저(Analyzer)를 거쳐 토큰으로 분리된다.
  • 이 타입을 활용해 필드를 만들면 내부적으로 _2gram, _3gram이라는 멀티 필드(Multi Field)도 같이 만든다.
 
 

✅ _2gram, _3gram은 어떻게 구성되어 있을까?

search_as_you_type의 _2gram은 두 단어씩 묶어서 토큰을 만든다._3gram은 세 단어씩 묶어서 토큰을 만든다. 무슨 말인지 Analyze API를 활용해 직접 눈으로 확인해보자.
 
  1. 인덱스 생성
    1. DELETE /products PUT /products { "mappings": { "properties": { "name": { "type": "search_as_you_type", "analyzer": "nori" } } } }
       
  1. Analyze API로 디버깅하기
    1. 영어 문장
      GET /products/_analyze { "field": "name", "text": "You have the big banana" } GET /products/_analyze { "field": "name._2gram", "text": "you have the big banana" } GET /products/_analyze { "field": "name._3gram", "text": "you have the big banana" }
한글 문장
GET /products/_analyze { "field": "name", "text": "프리미엄 감귤 선물세트" } GET /products/_analyze { "field": "name._2gram", "text": "프리미엄 감귤 선물세트" } GET /products/_analyze { "field": "name._3gram", "text": "프리미엄 감귤 선물세트" }
 
 

✅ 검색해보기

notion image
 
  1. 인덱스 생성
    1. DELETE /products PUT /products { "mappings": { "properties": { "name": { "type": "search_as_you_type", "analyzer": "nori" } } } }
       
  1. 데이터 삽입
    1. POST /products/_doc { "name": "곱창 돌김생김" } POST /products/_doc { "name": "구운 돌김" } POST /products/_doc { "name": "완도 곱창 돌김 100매" } POST /products/_doc { "name": "삼성 노트북" } POST /products/_doc { "name": "Nike 신발" }
       
  1. 데이터 검색하기
    1. GET /products/_search { "query": { "multi_match": { "query": "돌김", "type": "bool_prefix", "fields": [ "name", "name._2gram", "name._3gram" ] } } }
      • multi_match : 여러 필드에 걸쳐서 데이터 검색
      • bool_prefix : 앞쪽 단어는 match, 마지막 단어는 prefix match
        • you have th라고 검색하면 앞쪽 단어인 you와 have는 역인덱스에 저장된 토큰과 일치하는 데이터를 찾고, 마지막 단어인 th는 역인덱스에 저장된 토큰 중에 th로 시작하는 데이터를 찾는다.
      • name._2gram, name._3gram 필드에서도 검색을 하는 이유는 연속적으로 단어가 일치할수록 score를 더 높게 측정해 상위 노출되도록 만들기 위함이다.
       
      // 1글자로 검색해도 검색 잘 됨 GET /products/_search { "query": { "multi_match": { "query": "돌", "type": "bool_prefix", "fields": [ "name", "name._2gram", "name._3gram" ] } } } // 순서 바뀌어도 검색 잘 됨 GET /products/_search { "query": { "multi_match": { "query": "돌김 구운", "type": "bool_prefix", "fields": [ "name", "name._2gram", "name._3gram" ] } } } // 순서까지 일치하면 score가 더 높게 측정됨 GET /products/_search { "query": { "multi_match": { "query": "구운 돌김", "type": "bool_prefix", "fields": [ "name", "name._2gram", "name._3gram" ] } } }
       
 

✅ 자동 완성 기능 구현 방식

notion image
글씨를 타이핑할 때마다 API 서버로 요청을 보내 자동 완성에 보여줄 데이터를 반환한다.
 
 
author
JSCODE 박재성
category
Elasticsearch
createdAt
Dec 6, 2025
series
실전에서 바로 써먹는 Elasticsearch 입문 (검색 최적화편)
slug
type
series-footer
updatedAt
Dec 6, 2025 05:12 AM
📎
이 글은 실전에서 바로 써먹는 Elasticsearch 입문 (검색 최적화편) 강의의 수업 자료 중 일부입니다.