[TIL] 88일차 _ 번쩍 팀프로젝트 #20

Seoyeon Lee·2026년 2월 6일

Today I Learned ...

오늘은 드디어 엘라스틱 서치를 도입해보기 시작했다!


🖥️ 번쩍 팀프로젝트 #20

오늘은 그토록 기다리고 기다리던 엘라스틱 서치를 도입해보기 시작했다!

엘라스틱 서치는 대용량 데이터를 아주 빠르게 검색, 분석하기 위한 분산 검색 엔진으로, 역색인 사용을 통한 빠른 검색, 여러 노드에 데이터를 나누는 분산 구조 저장, 실시간 집계 및 통계 분석 등의 기능을 제공한다.
엘라스틱 서치는 수집을 담당하는 Logstash, 저장과 검색을 담당하는 Elasticsearch, 시각화를 담당하는 Kibana와 함께 사용되어 ELK 스택이라고도 불린다.
이 ELK 스택을 통해서는 로깅과 모니터링 시스템, 검색 기능, 실시간 데이터 분석 대시보드 등을 구현할 수 있는데,
나는 이 중에서 검색 기능에만 초점을 맞춰 사용하려고 한다.

우선 엘라스틱 서치는 테이블과 컬럼 등을 부르는 용어가 조금 다르다.
MySQL의 테이블은 인덱스(index), 컬럼은 필드(field), 레코드는 도큐먼트(document), 스키마는 매핑(mapping)이라 부른다.
대부분의 용어들을 다른 의미로 알고 사용해왔었기 때문에, 처음 엘라스틱 서치를 접했을 때는 굉장히 헷갈렸다.

엘라스틱 서치에서는 데이터를 저장하고 조회할 때 RESTful API를 사용하는데, 오늘은 이 부분에 대해 연습하고, 스프링에서 간단한 데이터 조회를 진행해보았다.

PUT /index_name
{
  "mappings": {
    "properties": {
    	"title": {
	      	"type": "text",
    	    "analyzer": "nori" // 노리 한글 형태소 분석기 적용
		},
        "content": { "type": "text" }
    }
  }
}

우선 엘라스틱 서치에서 인덱스를 만들고, 스키마를 지정할 때는 이렇게 PUT 요청을 통해 진행할 수 있다.
엘라스틱 서치에서는 text 타입으로 저장된 데이터들에 대해서 역색인 작업을 진행한다.

이때, analyzer를 통해 어떻게 역색인 작업을 진행할 것인지를 지정할 수도 있는데, 엘라스틱 서치에서는 기본적으로 영어를 대상으로 역색인 작업을 진행한다.
영어의 대소문자를 구분하지 않고 저장하게 하도록 할 수도 있고, 영어의 조사와 같이 불필요한 문자를 제거하고 역색인 작업을 진행하게 할 수도 있고, 단어를 기본 형태로 저장하게 할 수도 있다.

그런데, 이런 analyzer는 한국어를 대상으로는 작업을 진행할 수 없기 때문에, 한글의 형태소를 분석하는 nori라는 플러그인을 추가로 설치해 진행해야 한다.
이 nori analyzer를 사용하면 한국어도 영어처럼 필요하지 않은 조사를 삭제하고, 동사를 원형 그대로 저장해 사용할 수도 있다.
최근에는 영어와 한국어를 같이 사용하는 일이 많기 때문에, 이 nori analyzer와 영어의 형태소를 구분하는 기본 analyzer를 함께 사용할 수도 있다.

이렇게 저장된 데이터들을 형태소 단위로 나누어 역색인 작업을 진행할 수 있게 되고, 검색을 할 때도 검색어 자체를 형태소 단위로 나누어 검색하게 된다.
기존에 RDB를 통해 검색할 때에는 검색어의 순서가 바뀌거나, 띄어쓰기가 다른 경우에도 제대로 검색할 수 없게 된다.
하지만, 이렇게 엘라스틱 서치를 통해 검색할 경우에는 검색어의 순서가 바뀌어도, 띄어쓰기가 달라도, 심지어는 오탈자가 있어도 검색이 가능해진다.
그래서 검색 서비스를 제공하는 서비스에서는 대부분 엘라스틱 서치를 사용한다고 한다.

지금 서비스에서는 모임의 제목에 대해서만 엘라스틱 서치에 저장해두고, 키워드 검색 시에만 엘라스틱 서치를 사용하도록 구현해두었다.
하지만, 엘라스틱 서치에서 지리적 범위 검색 또한 지원하고, 빠른 필터링 기능도 제공하고 있기 때문에, 점차적으로 엘라스틱 서치의 적용 범위를 늘려보려고 한다.

우리 팀이 작성한 코드는 깃허브를 통해 업로드해두었다.
GitHub 보러가기


🙃 오늘의 느낀점

엘라스틱 서치의 도입을 매번 기대하고 있었는데, 사용해보니 성능이 너무 너무 좋다!
그치만 그만큼 사용하기가 까다롭고, 어렵기 때문에, 어떻게 해야 우리 서비스에 맞게 잘 사용할 수 있을지를 더 고민해보아야겠다.

profile
백엔드 개발자 지망생

0개의 댓글