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
exercise-create-index-and-multi-field-search
type
post
updatedAt
Dec 6, 2025 04:48 AM

✅ 요구사항 반영하기

검색을 했을 때 상품명, 상품 설명, 카테고리명을 기반으로 관련된 상품을 검색해야 한다. (상품명 : 상품 설명 : 카테고리명의 score 가중치를 3 : 1 : 2로 설정하기)
Spring Data Elasticsearch에 익숙한 사람은 Spring Boot에서 코드를 작성해도 된다. 하지만 그렇지 않다면 Kibana에서 요구 사항을 만족시키는 쿼리를 작성한 뒤에 Spring Boot 코드로 옮기는 게 훨씬 편하다. 따라서 Kibana에서 요구 사항을 만족시키는 쿼리를 작성해보자.
 
  1. Clone 받은 프로젝트가 정상적으로 실행되는 지 확인하기
    1. Spring Boot 프로젝트를 시작하기 전에 로컬 환경에 MySQL이 실행되어 있어야 하고, MySQL에 coupang이라는 데이터베이스가 만들어져 있어야 한다. 그리고 로컬 환경에 설치된 MySQL의 username과 password에 맞게 application.yml 파일을 수정해야 한다.
      application.yml
      spring: datasource: url: jdbc:mysql://localhost:3306/coupang username: root password: password123 driver-class-name: com.mysql.cj.jdbc.Driver jpa: hibernate: ddl-auto: update show-sql: true
       
      그런 뒤에 Spring Boot 서버를 실행시켜보자. 아무런 에러 없이 잘 실행된다면 정상적으로 Spring Boot와 MySQL이 연결되서 작동하는 것이다.
      notion image
       
       
  1. 인덱스 생성하기, 매핑 정의하기
    1. Spring Boot에서 정의해놓은 Product 엔티티가 다음과 같은 필드를 가지고 있다. 그에 맞게 Elasticsearch에서 인덱스를 생성하고 매핑을 정의하자.
       
      Product 엔티티
      @Entity @Table(name = "products") public class Product { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String name; @Column(columnDefinition = "TEXT") private String description; // 에디터가 HTML로 상품 설명을 저장 private int price; private double rating; private String category; ... }
       
      products 인덱스 생성 / 매핑 정의
      DELETE /products PUT /products { "mappings": { "properties": { "id": { "type": "long" }, "name": { "type": "text" // 유연한 검색 필요 }, "description": { "type": "text" // 유연한 검색 필요 }, "price": { "type": "integer" // 10억 이하의 정수 }, "rating": { "type": "double" // 실수(소수점을 가진 숫자 포함) }, "category": { "type": "text" // 유연한 검색 필요 } } } } GET /products
      상품명, 상품 설명, 카테고리명을 기반으로 관련된 상품을 검색하기 위해 name, description, category를 text 타입으로 매핑했다.
       
  1. 테스트용 데이터 넣기
    1. POST /products/_doc { "id": 1, "name": "lg tv", "description": "", "price": 10000, "rating": 5.0, "category": "" } POST /products/_doc { "id": 2, "name": "", "description": "lg tv", "price": 10000, "rating": 5.0, "category": "" } POST /products/_doc { "id": 3, "name": "", "description": "", "price": 10000, "rating": 5.0, "category": "lg tv" }
       
  1. 검색하기
    1. GET /products/_search { "query": { "multi_match": { "query": "lg", "fields": [ "name^3", "description^1", "category^2" ] } } }
      • 상품명(name), 상품 설명(description), 카테고리(category)에 포함된 키워드로 검색하더라도 검색이 잘 되는 걸 확인할 수 있다.
      • 응답값을 보면 가중치에 따라 score가 책정되는 걸 확인할 수 있다. 그리고 score를 기준으로 데이터가 정렬돼서 조회된다.
       
👨🏻‍🏫
첫 번째 요구사항을 만족시켰다. 다음 강의에서 다른 요구사항도 차근차근 만족시켜보자.
author
JSCODE 박재성
category
Elasticsearch
createdAt
Dec 6, 2025
series
실전에서 바로 써먹는 Elasticsearch 입문 (검색 최적화편)
slug
type
series-footer
updatedAt
Dec 6, 2025 05:12 AM
📎
이 글은 실전에서 바로 써먹는 Elasticsearch 입문 (검색 최적화편) 강의의 수업 자료 중 일부입니다.