1. 글을 쓰게 된 계기
프로젝트에서 검색 기능을 구현하기 위해 Elasticsearch(이하 ES)를 도입하게 되었고, 데이터를 저장하고 검색하는 과정에서 ES가 내부적으로 어떻게 동작하는지 궁금해졌다.
이후 관련 서적을 통해 ES의 인덱싱 구조와 검색 로직, 데이터 저장 방식 등을 공부하게 되었고, 이를 정리해 블로그에 기록으로 남기기로 했다.
2. Elasticsearch 기본 개념 정리
ES의 작동 원리를 이해하기 위해서는 먼저 몇 가지 기본 용어와 개념부터 정리할 필요가 있다.
✅ Document
Elasticsearch에서 데이터를 저장하는 기본 단위다.
관계형 데이터베이스(RDB)에서의 **레코드(Row)**에 해당한다.
✅ Index
도큐먼트(Document)들을 모아 놓은 논리적인 저장 단위다.
RDB에서의 테이블과 유사한 개념이라고 볼 수 있다.
✅ Shard
Index는 내부적으로 **Shard(샤드)**라고 불리는 물리적인 단위로 나뉘며,
ES는 데이터 분산 저장 및 병렬 검색을 위해 샤드 구조를 사용한다.
각 샤드는 Lucene 인스턴스이며, 실질적인 저장과 검색은 이 샤드 단위에서 수행된다.
✅ Full-text Search (풀텍스트 검색)
ES의 가장 강력한 기능 중 하나는 자연어 기반의 풀텍스트 검색이다.
이 기능은 Apache Lucene이라는 검색 엔진 라이브러리를 기반으로 구현된다.
3. 도큐먼트 인덱싱(저장) 과정
Elasticsearch에서 도큐먼트가 저장되는 전체 과정을 아래와 같이 요약할 수 있다.
🔁 전체 흐름 요약
- 클라이언트 → 인덱싱 요청 전송 (POST/PUT)
- 도큐먼트 분석 및 토큰화 (Analyzer 동작)
- 역색인(Index), BKD Tree, Doc Values 생성
- 온 메모리 버퍼에 임시 저장
- Refresh 주기마다 디스크로 Flush
- Segment 병합(Merge) 및 삭제 처리
4. 각 단계별 상세 설명
1) 클라이언트의 인덱싱 요청
클라이언트(예: Spring, REST API)는 POST 또는 PUT 메서드를 통해
ES에 도큐먼트 저장 요청을 보낸다.
POST /my-index/_doc/1
{
"title": "Elasticsearch Study",
"content": "Elasticsearch is a powerful search engine."
}
2) 도큐먼트 분석 및 처리
도큐먼트가 저장되기 전에, text 타입의 필드들은 **Analyzer(분석기)**를 통해 다음과 같은 처리를 거친다.
- Tokenization (토큰화): 문장을 단어로 분리
- Normalization (정규화): 소문자화, 어간 추출, 동의어 처리 등
→ 이 과정을 통해 **역색인(Inverted Index)**이 만들어진다.
반면, keyword, integer, date 등의 타입은 분석기를 거치지 않고
Doc Values 또는 BKD Tree 구조로 저장된다 (정렬, 집계에 사용됨).
3) 메모리 버퍼에 임시 저장
ES는 인덱싱 요청이 들어올 때마다 즉시 디스크에 쓰지 않는다.
→ 이유: 매 요청마다 디스크에 쓰면 I/O 부하가 심해지기 때문
그래서 모든 인덱싱 작업은 일단 **온 메모리 버퍼(Translog)**에 저장된다.
4) 새로고침(Refresh)
ES는 기본적으로 1초에 한 번씩 Refresh를 수행한다.
이때 메모리 버퍼의 내용을 디스크로 flush하여 **세그먼트(Segment)**라는 파일에 저장한다.
세그먼트는 Lucene이 사용하는 물리적 저장 단위이며, 불변(Immutable)이다.
5) 삭제 방식: Soft Delete
세그먼트는 한 번 저장되면 변경되지 않는다.
따라서 삭제 요청이 오더라도 실제 데이터를 바로 지우지 않고,
Deleted Bit를 이용해 “삭제됨”으로만 표시한다.
6) 병합(Merge) 처리
세그먼트가 계속 늘어나면 검색 시 여러 세그먼트를 순회해야 하므로 성능이 저하된다.
이를 방지하기 위해 ES는 주기적으로 세그먼트를 병합한다.
- 병합 시 불필요한 문서(Deleted Bit가 체크된)는 완전히 삭제됨
- 데이터 크기 줄어듦 → 검색 성능 향상
병합은 내부적으로 Level0 ~ LevelN까지 단계별로 수행되며,
같은 레벨의 세그먼트가 3개 이상이면 상위 레벨로 병합된다.
5. 요약: Elasticsearch의 저장 전략 정리
단계 설명
분석기 작동 | 텍스트는 토큰화 → 역색인 생성 |
메모리 저장 | 모든 데이터는 일단 버퍼에 저장 |
Refresh | 일정 주기로 디스크에 flush |
Segment 생성 | 불변 구조, 성능 최적화 |
Soft Delete | 실제 삭제는 아님, 마크 처리 |
병합(Merge) | 세그먼트 수를 줄여 성능 유지 |
'Elasticsearch' 카테고리의 다른 글
[Elasticsearch 보안 설정] 비밀번호 인증 활성화 및 Spring, Kibana 연동 (0) | 2025.03.22 |
---|---|
[Elasticsearch] Docker 환경에서 스냅샷(Snapshot) 백업 및 자동화 설정 (0) | 2025.03.21 |
[ElasticSearch] 인기 검색어 쿼리 구현 (0) | 2025.03.11 |
[ElasticSearch] ElasticSearch Native Query 최신 버전 작성 (0) | 2025.03.04 |
[ElasticSearch] bool 타입 minimum_should_match 오류 (0) | 2025.03.04 |