주뇽's 저장소

🔍 엘라스틱서치(Elasticsearch) – 검색이 되는 이유부터 인덱싱까지 본문

데이터베이스/Elastic Search

🔍 엘라스틱서치(Elasticsearch) – 검색이 되는 이유부터 인덱싱까지

뎁쭌 2025. 4. 26. 23:42
728x90
반응형

엘라스틱서치의 모든 것 – RDB의 한계를 넘는 검색 시스템 구축 가이드 🔍

이번 글에서는 전통적인 RDB의 한계부터 역인덱스 개념, 그리고 이를 기반으로 한 엘라스틱서치의 구조와 검색 방식, 실무 예제까지 한 번에 정리한다.


1. LIKE 쿼리의 한계 😵

많은 개발자들이 처음에는 RDB의 LIKE '%검색어%' 쿼리로 검색 시스템을 구성한다.
하지만 이 방식은 실무에서 금방 한계에 부딪히게 된다.

문제 설명
🔸 부분 일치 한계 %API 응답 시간%은 검색되지만 %API 지연 시간%은 누락될 수 있음
🔸 대소문자 민감 Timeouttimeout
🔸 동의어 인식 불가 "레디스""Redis"는 별개 처리됨
🔸 검색 정확도 없음 유사도(score)를 기준으로 정렬 불가능

→ 결국, LIKE 쿼리는 단순 문자열 검색에는 유용하지만,
대용량 로그, 한글 형태소 분석, 동의어/의미 기반 검색이 필요한 실무에서는 부족하다.


2. Full Text Search(FTS)란? 🚀

✅ 인덱스란?

FTS는 문장을 단어 단위로 미리 분해(토크나이징) 하여 저장하고,
검색 시 해당 단어가 포함된 문서를 빠르게 역참조하는 구조이다.
이때 만들어지는 구조가 바로 역인덱스(Inverted Index) 이다.


🔍 RDB에서도 FTS는 가능하지만...

MySQL, PostgreSQL 등에서도 FTS(Full Text Search)를 지원하지만 실무에서 활용하기에는 여러 한계가 존재한다.

항목 RDB FTS 엘라스틱서치
언어 분석 단순 분리 형태소 분석, 사용자 사전 활용 가능
대소문자 구분 O 자동 소문자 처리
동의어 처리 거의 불가 synonym 필터로 유연하게 처리 가능
커스터마이징 매우 제한적 tokenizer, filter, analyzer 설정 가능
검색 정확도 점수 거의 없음 score 계산 및 관련도 기반 정렬 가능

→ 복잡한 텍스트 검색이나 한글 기반 검색이 필요한 환경이라면,
엘라스틱서치의 분석기 설정과 커스터마이징 기능이 훨씬 강력한 선택지가 된다.


3. 역인덱스란 무엇인가? 📚

일반 색인(forward index)은 "문서 → 단어" 구조이지만,
역인덱스(inverted index)는 "단어 → 문서" 구조이다.

예를 들어, 다음과 같은 로그 데이터를 색인한다고 하자.

문서1: API 요청 처리 속도 향상  
문서2: Redis 캐시를 적용하여 응답 시간 개선  
문서3: 검색 API에 캐시 미적용으로 병목 발생

이를 역인덱스로 구성하면 아래와 같다.

단어 포함 문서
API 문서1, 문서3
요청 문서1
캐시 문서2, 문서3
응답 문서2
병목 문서3

→ 검색어 "캐시"에 대해 빠르게 문서2, 문서3을 찾아낼 수 있다.


4. 엘라스틱서치의 인덱싱 구조 🔧

엘라스틱서치는 다음과 같은 3단계로 문서를 분석하고 인덱싱한다.

1. char_filter → 2. tokenizer → 3. token_filter

1️⃣ char_filter

문자 정제를 수행하는 단계이다.

  • HTML 제거
  • 외국 숫자 → 아라비아 숫자 변환
  • 정규식 기반 문자 치환

2️⃣ tokenizer

문장을 단어로 분해하는 핵심 단계이다.

예시:

"Redis 캐시를 적용하여 응답 속도를 개선함"  
→ ["redis", "캐시", "적용", "응답", "속도", "개선"]

한글은 nori_tokenizer를 사용하며,
형태소 분석 + 사용자 사전 기반 분해를 지원한다.

3️⃣ token_filter

추출된 토큰에 추가 가공을 적용한다.

  • lowercase: 소문자화
  • stop: 조사/불용어 제거
  • synonym: 동의어 처리
  • stemmer: 어간 추출 (예: doingdo)

5. 엘라스틱서치가 빠른 이유는 무엇인가? 🛰

사용자가 "API 캐시"라는 키워드로 검색한다고 가정해보자.
엘라스틱서치는 다음과 같은 과정을 거친다.

  1. 검색어 "API 캐시"를 Analyzer가 토큰화 → ["api", "캐시"]
  2. 역인덱스를 통해 포함 문서를 조회
  3. SCORE를 계산하여 관련도 높은 문서부터 정렬
  4. 결과 반환

단어 기준 역참조 + 관련도 기반 정렬이 핵심이다.


6. 주요 구성 요소 이해하기 🧠

용어 설명
Index 색인 단위 (DB의 테이블 개념)
Document 저장되는 단일 JSON 객체 (DB의 row)
Field Document의 속성 (DB의 column)
Shard Index를 분산 저장하기 위한 물리 단위
Replica 장애 대비를 위한 샤드 복제본
Analyzer tokenizer + filter를 조합한 분석기

7. 엘라스틱서치의 장단점 정리 ✅❗️

✅ 장점

  • 형태소 분석, 동의어 인식 등 고급 검색 지원
  • SCORE 기반 정렬
  • Kibana와 연동 가능
  • 다국어 + JSON 기반 API
  • 수평 확장 및 샤딩 구조

❌ 단점

  • 실시간 아님 (약 1초 지연 존재)
  • 트랜잭션 및 롤백 미지원
  • UPDATE는 삭제 후 재색인 방식
  • 자동 매핑 기능은 실무에서 비효율 발생 가능

마무리 📝

엘라스틱서치는 단순한 검색 엔진이 아니다.
역인덱스 기반의 색인 구조, 강력한 커스터마이징, 대량 데이터 처리 성능을 바탕으로
실시간 로그 분석, 검색 시스템, 추천 시스템까지 다양한 분야에서 쓰이고 있다.