![[ElasticSearch] 검색어 추천 기능(search_as_you_type)](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpjbtH%2FbtsOmLfa2cL%2F2hGVKPM6O0bmBkzwhp9YGk%2Fimg.png)
[ElasticSearch] 검색어 추천 기능(search_as_you_type)Back-End/ElasticSearch2025. 6. 2. 08:43
Table of Contents
이 글은 인프런의 지식 공유자 박재성님의 강의를 듣고 개인적으로 정리하는 글임을 알립니다.
- 쿠팡 서비스에 들어가서 검색 창에 글자를 입력하면 글자에 해당하는 검색어를 추천해준다.
- 자동 완성 기능을 구현하는 방법에는 정말 다양한 방법이 존재한다.
- 그 중에서 가성비가 좋은 방법인 search_as_you_type을 활용하는 내용을 다룬다.
search_as_you_type
- Elasticsearch에서 자동 완성 기능을 쉽게 구현할 수 있게 설계된 데이터 타입이다.
- text 타입처럼 애널라이저(Analyzer)를 거쳐 토큰으로 분리된다.
- 이 타입을 활용해 필드를 만들면 내부적으로 _2gram, _3gram이라는 멀티 필드(Multi Field)도 같이 만든다.
_2gram, _3gram
PUT /products { "mappings": { "properties": { "name": { "type": "search_as_you_type", "analyzer": "nori" } } } } |
search_as_you_type의 _2gram은 두 단어씩 묶어서 토큰을 만든다._3gram은 세 단어씩 묶어서 토큰을 만든다.
예를 들어"You have the big banana" 라는 단어는 ["you", "have", "the", "big", "banana"] 이렇게 토큰으로 분리되고
- 2gram : ["you have", "have the", "the big", "big banana"]
- 3gram : ["you have the", "have the big", "the big banana"]
이렇게 분리된다.
"프리미엄 감귤 선물세트"라는 단어는 ["프리미엄", "감귤", "선물", "세트"](nori 애널라이저 기준) 이렇게 토큰으로 분리되고
- 2gram : ["프리미엄 감귤", "감귤 선물", "선물 세트"]
- 3gram : ["프리미엄 감귤 선물", "감귤 선물 세트"]
적용 방법
인덱스 생성
PUT /products { "mappings": { "properties": { "name": { "type": "search_as_you_type", "analyzer": "nori" } } } } |
데이터 삽입
POST /products/_doc { "name": "곱창 돌김생김" } POST /products/_doc { "name": "구운 돌김" } POST /products/_doc { "name": "완도 곱창 돌김 100매" } POST /products/_doc { "name": "삼성 노트북" } POST /products/_doc { "name": "Nike 신발" } |
검색
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를 더 높게 측정해 상위 노출되도록 만들기 위함이다.
한 글자마다 검색창에 입력할 때마다, 검색어 추천 API를 호출하여 추천 내용을 화면에 띄우는 것이다.
'Back-End > ElasticSearch' 카테고리의 다른 글
[ElasticSearch] 멀티 필드(Multi Field) (0) | 2025.06.02 |
---|---|
[ElasticSearch] 오타 허용 검색, 하이라이팅, 페이지네이션 및 정렬 (0) | 2025.06.01 |
[ElasticSearch] match, term, bool (3) | 2025.06.01 |
[ElasticSearch] 한글 검색 최적화(Nori Analyzer) (0) | 2025.06.01 |
[ElasticSearch] 데이터 타입(data type)과 매핑(mapping) (0) | 2025.05.31 |