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

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

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

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

하나의 필드에 text와 keyword 타입을 동시에 사용하고 싶을 때 (Multi Field)

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

✅ 하나의 필드에 text와 keyword 타입을 동시에 사용하고 싶을 때 (Multi Field)

이전 강의(
📖
매핑(mapping)이란? / 데이터 타입(data type)
)에서 데이터 타입을 설명할 때 text는 유연한 검색이 필요할 때 사용한다고 얘기했다. 반면에 keyword는 정확한 검색이 필요할 때 사용한다고 했다.
 
그런데 유연한 검색과 정확한 검색 둘 다 하고 싶은 경우가 있을 수 있다. 예를 들어, 상품 카테고리와 이름 필드에 저장된 필드 값에 대해 키워드로 검색할 때는 유연하게 검색되게 하고 싶고, 정확한 비교를 통해 특정 카테고리를 기준으로 필터링을 하고 싶을 수 있다. 즉, text 타입과 keyword 타입을 동시에 사용하고 싶은 경우이다.
 
이 문제를 어떻게 해결할 수 있는 지 바로 알아보자.
 
 

✅ 문제 상황

먼저 위에서 설명한 문제 상황부터 경험해보자.
  1. 인덱스 생성
    1. DELETE /products PUT /products { "mappings": { "properties": { "name": { "type": "text", "analyzer": "nori" }, "category": { "type": "text", "analyzer": "nori" } } } }
       
  1. 데이터 삽입
    1. POST /products/_doc { "name": "삼성 세탁기", "category": "특수 가전제품" }
       
  1. 검색하기
    1. [name, category을 활용해 유연하게 검색하고 싶을 때]
      GET /products/_search { "query": { "multi_match": { "query": "가전", "fields": ["name", "category"] } } }
       
      [특수 가전제품 카테고리의 상품만 검색하고 싶을 때]
      GET /products/_search { "query": { "term": { "category": "특수 가전제품" } } }
      ⇒ 제대로 작동하지 않는다! 이걸 해결하기 위해서는 인덱스의 category의 데이터 타입을 설정할 때 text 타입과 keyword 타입을 둘 다 선언해야 한다. 그 방법을 알아보자.
 
 

✅ 해결 방법

하나의 필드에 여러 개의 타입을 선언할 수 있는 방법을 활용할 것이다. 이 방법을 보고 Elasticsearch에서는 multi-fields라고 얘기한다.
 
  1. 인덱스 생성, 데이터 삽입
    1. DELETE /products PUT /products { "mappings": { "properties": { "name": { "type": "text", "analyzer": "nori" }, "category": { "type": "text", "analyzer": "nori", "fields": { "raw": { // 서브 필드명 (다른 이름으로 설정해도 됨) "type": "keyword" } } } } } }
      위와 같이 설정하면 category 필드에 하나의 데이터를 삽입하더라도 text, keyword 타입의 형태로 나눠서 보관하게 된다.
       
  1. 데이터 삽입
    1. POST /products/_doc { "name": "삼성 세탁기", "category": "특수 가전제품" }
      text 타입은 토큰으로 분리해서 저장하지만, keyword 타입은 값 자체를 통째로 저장한다. 그래서category에 특수 가전제품이라는 값을 삽입했을 때 아래와 같이 저장된다.
      category (text 타입)
      category.raw (keyword 타입)
      특수
      특수 가전제품
      가전
      ㅤ
      제품
      ㅤ
      정말 위와 같이 저장되는 지 확인해보자.
       
  1. Anaylze API로 디버깅해보기
    1. POST /products/_analyze { "field": "category", "text": "특수 가전제품" } POST /products/_analyze { "field": "category.raw", "text": "특수 가전제품" }
      위에서 예상한대로 토큰이 분리되는 걸 확인할 수 있다. 그럼 이제 실제 검색을 해보자.
       
  1. 검색해보기
    1. [name, category을 활용해 유연하게 검색하고 싶을 때]
      POST /products/_search { "query": { "multi_match": { "query": "가전", "fields": ["name", "category"] } } }
       
      [특수 가전제품 카테고리의 상품만 검색하고 싶을 때]
      POST /products/_search { "query": { "term": { "category.raw": "특수 가전제품" } } }
      정상적으로 잘 응답하는 걸 볼 수 있다.
 
 
author
JSCODE 박재성
category
Elasticsearch
createdAt
Dec 6, 2025
series
실전에서 바로 써먹는 Elasticsearch 입문 (검색 최적화편)
slug
type
series-footer
updatedAt
Dec 6, 2025 05:12 AM
📎
이 글은 실전에서 바로 써먹는 Elasticsearch 입문 (검색 최적화편) 강의의 수업 자료 중 일부입니다.