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

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

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

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

[실습] 동의어로 검색하는 방법 (synonym)

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

✅ 동의어로 검색하는 방법 (synonym)

Samaung Notebook이라는 상품이 있다고 가정하자. 사람들은 검색할 때 notebook이라고 정확하게 검색할 수도 있지만, 노트북, 랩탑, 휴대용 컴퓨터, laptop과 같이 동의어로 검색할 수도 있다. 그리고 samsung이라고 검색할 수도 있지만 삼성이라고 검색할 수도 있다. 이렇게 동의어로 검색하더라도 Samsung notebook이 나오게 하려면 어떻게 셋팅해야 하는 지 알아보자.
 
  1. Custom Analyzer를 활용해 인덱스 생성하기
    1. // 기존 인덱스 삭제 DELETE /products // 인덱스 생성 + 매핑 정의 + Custom Analyzer 적용 PUT /products { "settings": { "analysis": { "filter": { "products_synonym_filter": { "type": "synonym", "synonyms": [ "notebook, 노트북, 랩탑, 휴대용 컴퓨터, laptop", "samsung, 삼성" ] } }, "analyzer": { "products_name_analyzer": { "char_filter": [], "tokenizer": "standard", "filter": [ "lowercase", "products_synonym_filter" ] } } } }, "mappings": { "properties": { "name": { "type": "text", "analyzer": "products_name_analyzer" } } } } // 잘 생성됐는 지 확인 GET /products
       
  1. 데이터 삽입하기
    1. POST /products/_doc { "name": "Samsung Notebook" }
       
  1. 검색해보기
    1. GET /products/_search { "query": { "match": { "name": "노트북" } } } GET /products/_search { "query": { "match": { "name": "랩탑" } } } GET /products/_search { "query": { "match": { "name": "휴대용 컴퓨터" } } } GET /products/_search { "query": { "match": { "name": "laptop" } } } GET /products/_search { "query": { "match": { "name": "삼성" } } }
      synonym 설정 덕분에 위 쿼리로 검색해보면 데이터가 잘 조회된다. 왜 잘 조회가 된 건지 Analyze API를 활용해 디버깅해보자.
 
  1. Analyze API 사용하기
    1. GET /products/_analyze { "field": "name", "text": "Samsung Notebook" }
       
      응답값
      { "tokens": [ { "token": "samsung", "start_offset": 0, "end_offset": 7, "type": "<ALPHANUM>", "position": 0 }, { "token": "삼성", "start_offset": 0, "end_offset": 7, "type": "SYNONYM", "position": 0 }, { "token": "notebook", "start_offset": 8, "end_offset": 16, "type": "<ALPHANUM>", "position": 1 }, { "token": "노트북", "start_offset": 8, "end_offset": 16, "type": "SYNONYM", "position": 1 }, { "token": "랩탑", "start_offset": 8, "end_offset": 16, "type": "SYNONYM", "position": 1 }, { "token": "휴대용", "start_offset": 8, "end_offset": 16, "type": "SYNONYM", "position": 1 }, { "token": "laptop", "start_offset": 8, "end_offset": 16, "type": "SYNONYM", "position": 1 }, { "token": "컴퓨터", "start_offset": 8, "end_offset": 16, "type": "SYNONYM", "position": 2 } ] }
      분리된 토큰을 살펴보면 동의어까지 포함해서 토큰이 등록된 걸 확인할 수 있다. 이 때문에 동의어로 검색을 하더라도 원하는 데이터가 잘 조회된다.
       
       

✅ 정리

동의어로 검색할 수 있게 만들고 싶다면 token filter로 synonym을 활용하면 된다.
 
 
👨🏻‍🏫
지금까지 Elasticsearch에서 기본적으로 제공하면서도 많이 사용하는 Analyzer 기능에 대해 알아봤다. 다음 강의에서는 한글에서 자주 사용하는 Analyzer 기능들을 위주로 알아보자.
 
author
JSCODE 박재성
category
Elasticsearch
createdAt
Dec 6, 2025
series
실전에서 바로 써먹는 Elasticsearch 입문 (검색 최적화편)
slug
type
series-footer
updatedAt
Dec 6, 2025 05:12 AM
📎
이 글은 실전에서 바로 써먹는 Elasticsearch 입문 (검색 최적화편) 강의의 수업 자료 중 일부입니다.