01 ElasticSearch 개념
01 ElasticSearch 개념
1. Note
1. Note
- 벡터 디비와 어느정도 구분이 필요할듯
- 벡터디비는 임베딩시켜서 의미를 기반으로 검색
- 엘라스틱서치는 제이슨으로 만들어서 조건이나 키워드를 검색함.
- 각기 상황에 대한 목적이나 방향성을 보고 무엇을 할지 선택해야할듯
벡터DB, 엘라스틱서치
구분 벡터DB 엘라스틱서치 검색 방식 의미 유사도 키워드/조건 매칭 입력 자연어 문장 많이 사용 JSON DSL 많이 사용 내부 비교 벡터 거리 계산 inverted index 강점 의미 이해 정확한 필터링/속도 예시 “강아지 키우기 팁” ≈ “반려견 초보 가이드” “title에 강아지 포함” - 엘라스틱서치는
- JSON의 텍스트 필드를 토큰으로 분해해 역색인을 만들고,
- 조회 시 그 역색인을 이용해 “문서 후보”를 찾음
- 조회하는 방법은
- 병렬로!!
- 각 샤드에서 역색인을 이용해 문서 후보를 찾고
- BM25로 각 후보 문서의 관련도를 점수화한 뒤
- score 기준으로 정렬
- 정리하면
- 사용자 입장에서는 특정 데이터를 조회하는건데
- 엘라스틱서치 입장에서는 알고리즘에 의한 데이터 정렬
2. ElasticSearch
1. ElasticSearch
- 오픈소스 기반의 대용량 데이터를 빠르게 검색하고 조회하기 위한 분산 검색 엔진
- 데이터를 저장하면서, 그 데이터를 매우 빠르게 검색·분석할 수 있게 만든 검색 특화 데이터베이스에 가까움
- 검색을 위해 데이터를 색인(Indexing)해서 빠르게 찾아주는 엔진
2. ElasticSearch 흐름
1. 저장 단계 (Indexing)
- JSON 데이터를 검색 가능한 구조로 바꾸는 과정
- 내부작업
- JSON 문서 입력
- analyzer로 텍스트 분해
- 역색인(inverted index) 생성
- _source에 원본 JSON 저장
- doc values 생성 (정렬/집계용)
- 샤드(Lucene)에 저장
2. 검색 단계 (Query Execution)
- 조건에 맞는 문서 찾기
- 내부작업
- 쿼리 입력
- 모든 샤드에 병렬 요청
- 각 샤드에서 역색인으로 문서 찾음 / score 계산 (BM25)
- 결과 일부(top N) 반환 (쿼리에 따른 결과)
3. 정렬/결과 합치기 (Reduce Phase)
- 전체 결과를 하나로 합쳐 최종 응답 생성
- 흐름
- 각 샤드 결과 수집
- score 기준으로 정렬 (또는 sort 기준)
- top K 선택
- _source에서 JSON 추출(원본추출)
- 최종 결과 반환
3. 주요특징
1. 매우 빠른 검색 성능
- 일반 DB처럼 데이터를 처음부터 끝까지 찾는 방식이 아니라, 역색인(Inverted Index) 기반으로 검색
1 2 3 4 5 6 7 8 9 10 11 12 13 14
-- 일반적인 DB는 전체를 순서대로 맥북을 조회하여 일치여부를 검증함. SELECT * FROM product WHERE name LIKE '%맥북%' -- 엘라스틱 서치는 데이터가 있다면 1번 문서: 맥북 프로 2번 문서: 아이패드 프로 3번 문서: 맥북 에어 -- 단어 중심으로 색인을 구성 맥북 → 1,3 프로 → 1,2 아이패드 → 2
- 검색할 때 계산하는 것이 아니라, 저장할 때 검색 준비를 끝내두는 것에 가까움
2. 전문 검색(Full Text Search)에 강함
- 사람이 실제 검색하는 방식에 가까운 검색을 지원
- 오타 허용(Fuzzy Search)
- 유사 단어 검색
- 부분 일치 검색
- 문맥 기반 검색
- 흐름
1 2 3 4 5
# 검색문장 '쿠버네티스를 공부하고 있습니다' # 핵심단어 추출하여 조회 '쿠버네티스','공부'
3. JSON 기반 Document 저장 구조
- 엘라스틱서치는 데이터를 JSON 형태(Document) 로 저장
1 2 3 4 5 6
{ "name": "맥북 프로", "price": 3200000, "brand": "Apple" } # 새로운 속성이 생겨도 그냥 Key만 추가하여 유연하게 저장 가능함 - 지속적으로 쌓이고 변경되는 경우 유리함.
- 로그 데이터
- 사용자 이벤트
- 비정형 데이터
- AI 메타데이터
4. Near Real Time 검색 지원
- 데이터를 저장하고 거의 즉시 검색 가능함
- Near Real Time (준실시간)
- 상품을 등록하면 몇 초 안에 검색 결과에 노출될 수 있음
- 성능 최적화를 위해 데이터를 즉시 검색 가능 상태로 만들지 않고, 일정 주기마다 refresh를 수행
5. 분산 처리와 수평 확장(Scale Out)
- 처음부터 대용량 분산 환경을 고려해 설계
- 데이터가 많아지면 단순히 서버 성능만 높이는 것이 아니라 서버를 추가 해서 확장할 수 있음
- 하나의 Cluster로 구성
- 데이터는 내부적으로 Shard(샤드) 단위로 분산 저장
- 데이터가 커질수록 서버를 붙여서 확장하기 쉬운 구조
6. 장애 대응(High Availability)
- 데이터 복제를 통해 장애 상황에도 대응할 수 있음
Primary Shard,Replica Shard로 구성됨.- Primary Shard가 문제가 생기면 Replica shard가 대체됨
- 검색 서비스 안정성이 높으며, 대규모 서비스 환경에서 많이 사용하게됨
7. 강력한 집계(Aggregation) 기능
- 단순 검색 엔진이 아니라 분석 엔진 역할도 수행
- 카테고리별 판매량
- 가장 많이 검색된 키워드
- 평균 결제 금액
- 시간대별 사용자 수
8. REST API 기반 동작
- 엘라스틱서치는 대부분 기능을 HTTP API 로 제공
1 2
POST /products/_doc # 저장 GET /products/_search # 검색
- JSON 기반 요청/응답 구조라서, Spring Boot와 같은 백엔드 프레임워크와 연동하기 쉬움
- HttpMethod에 따라서 작업이 달라지게됨
3. ElasticSearch 구조
1. 구조
1. 전체구조

- 레벨
1 2 3 4 5
Cluster (전체 시스템) └── Node (개별 서버, 여러 대) └── Index (문서 묶음, MySQL의 DB와 비슷) └── Shard (Index의 조각, 분산 저장 단위) └── Document (실제 데이터, JSON 한 건)
2. 클러스터
- 클러스터
- 여러 개의 노드를 하나의 검색 시스템처럼 묶은 단위
- 하나의 검색 서비스를 위해 여러 노드가 협력하는 구조
- 주요 역할
- 데이터 저장 및 검색 관리
- 노드 간 데이터 분산
- 장애 발생 시 복구
- 검색 요청 병렬 처리
클러스터 상태
상태 의미 GreenPrimary + Replica 샤드 모두 정상 YellowPrimary 정상, Replica 일부 미배치 RedPrimary 샤드 손실 → 일부 데이터 검색 불가
3. 노드
- 노드
- Elasticsearch가 실행되는 서버(인스턴스) 1대
- 클러스터 내부에서 실제 CPU, 메모리, 디스크 자원을 사용하여 검색과 저장 작업을 수행
Coordinating Node가 필요한 Data Node들에 요청해서 데이터를 찾고 결과를 합침
- 주요 역할
- 검색 요청 처리
- 샤드 저장
- 데이터 분산 처리
- 병렬 검색 수행
노드 역할 종류
역할 설명 Master Node클러스터 상태 관리 및 노드/샤드 관리 Data Node실제 데이터 저장 및 검색 수행 Ingest Node데이터 전처리(Pipeline) 수행 Coordinating Node요청 분배 및 결과 병합 ML Node머신러닝 작업 수행
4. 샤드
- 샤드
- 데이터를 여러 조각으로 분산 저장하는 단위
- 대용량 데이터를 효율적으로 처리하기 위해 데이터를 여러 개로 나누어 저장
- 샤드 구성
1 2 3 4 5 6 7 8 9 10 11 12 13
# 각 데이터 노드는 N개의 샤드를 가짐 # DataNode에만 붙는거는 맞지만, 몇개가 붙는지는 Master Node가 결정함. Node1 (Data Node) ├─ Primary Shard1 └─ Replica Shard2 Node2 (Data Node) ├─ Primary Shard2 └─ Replica Shard3 Node3 (Data Node) ├─ Primary Shard3 └─ Replica Shard1
샤드 종류
종류 설명 Primary Shard원본 데이터 저장 Replica ShardPrimary 복제본, 장애 대응 및 읽기 성능 향상 - 샤드 내부구조
- 역색인 (Inverted Index)
- 검색용 구조
- “단어 → 문서 목록”
- _source (원본 JSON)
- 문서 전체 JSON을 그대로 저장
- 기본적으로 압축된 형태로 저장됨
- 응답에서 그대로 반환되는 핵심 데이터
- Stored Fields (선택 저장 필드)
- 일부 필드만 따로 저장 가능
- _source 없이도 일부 값 반환하려고 사용
- Doc Values
- 정렬, 집계용 컬럼 기반 구조
- 예: price 정렬, aggregation 계산
- 역색인 (Inverted Index)
This post is licensed under CC BY 4.0 by the author.