
📗 ElasticSearch란?
ElasticSearch는 루씬(Lucene) 기반의 오픈 소스 검색 엔진입니다.
JSON기반의 문서를 저장, 검색할 수 있으며 문서들의 데이터를 기반으로 분석 작업까지 가능합니다.
[ 기본적인 특징 ]
| 항목 | 특징 |
| 준실시간성 검색 엔진 | 실시간이라고 생각할만큼 색인된 데이터가 매우 빠르게 검색됨 |
| 클러스터 구성 | 한 대 이상의 노드를 클러스터로 구성하여 높은 수준의 안정성을 이루고 부하를 분산할 수 있음 |
| 스키마리스(Schemaless) | 입력될 데이터에 대해 미리 정의하지 않아도 동적으로 스키마를 생성할 수 있음 |
| Rest API | Rest API 기반의 쉬운 인터페이스를 제공하여 비교적 진입 장벽이 낮음 |
❓ 준실시간성
실시간에 준하는 수준의 검색을 제공한다는 의미로 문서를 입력하자마자 검색하는 것은 불가능하더라도 1초의 시간이 흐른 후에는 검색할 수 있기 때문이다. 준실시간성은 성능 최적화를 위해 사용하는 refresh_interval이라는 파라미터에 영향을 받는다. 해당 값의 기본값 1초로 색인된 문서가 검색에서 조회가 가능해지기까지의 시간을 제어하며 '-1'로 설정해 새로고침을 비활성화하고 성능을 올릴 수도 있다.
❓ 클러스터
1개 이상의 노드를 묶어서 하나의 클러스터로 구성해 높은 안정성과 부하를 분산할 수 있다. 모든 노드는 Mesh형태로 요청을 주고 받기 때문에 각 노드가 다양한 역할을 맡아 요청을 분산하여 처리할 수 있다.
❓ 스키마리스
문서를 입력하기에 앞서 어떤 필드를 저장할 것인지 사전에 정의하지 않아도 된다. 일반적인 RDBMS와 다르게 스키마를 동적으로 생성한다.
📕 ElasticSearch 기본 동작

[ API 종류 ]
| PUT | 새로운 문서 입력 |
| GET | 조회 |
| POST | 기존 문서 수정 |
| DELETE | 삭제 |
ex) curl을 통한 api 호출 예시
curl -X PUT "localhost:9200/user/_doc/1?pretty" -H 'Content-Type: application/json' -d' >
{
"name": "lee"
}
'
💡 주목할만한 특징
- ElasticSearch 6 버전 이상에서는 하나의 인덱스에 하나의 타입만 저장할 수 있다. 그래서 이미 정의해둔 스키마와 다른 형태의 데이터가 입력되면 에러가 발생, 해당 문서는 색인되지 않는다.
- '_search'로 시작하는 search API를 기반으로 분석 작업 및 검색이 가능하며 이를 aggregation이라고 부른다.
📘 ElasticSearch 모니터링
ElasticSearch는 보통 2개 이상의 노드로 구성된 클러스터로 구축되어 모니터링 시스템을 통해 시각화하는 것이 필수로 여겨진다. 특정 인덱스의 샤드들이 어떤 노드에 배치되어 있는지, 인덱스별 사용량이나 데이터 타입별 사용량, 힙 메모리 상태 등을 모니터링하며 안정적으로 운영할 수 있다.
| 모니터링 시스템 | 장점 | 단점 |
| Head | 클러스터의 전반적인 동작 상태를 확인할 수 있다. | 성능 지표 등은 확인하기 어렵다. |
| 프로메테우스 | 다량의 클러스터를 운영하고 있을 때 구축하기 수월하다. | 확인할 수 있는 정보량이 X-Pack에 비해 상대적으로 적다. |
| X-Pack | 모니터링 시스템 중 가장 많은 정보를 확인할 수 있다. 모니터링 전용 클러스터를 구축할 수 있다. |
6.3 이전 버전이라면 Basic 라이선스를 매년 갱신해야 하며, 색인 성능에 영향을 줄 수 있다. (이후 버전은 갱신 필요 없음) |
📙 ElasticSearch 기본 개념
[ 클러스터와 노드의 의미 ]

❓ 클러스터란
여러 대의 컴퓨터 혹은 구성 요소들을 논리적으로 결합, 전체를 하나의 컴퓨터 혹은 하나의 구성 요소처럼 사용하게 해주는 기술
| 노드 역할 | 설명 |
| 마스터 | 클러스터 구성에서 중심이 되는 노드, 클러스터의 상태 등 메타데이터를 관리한다. |
| 데이터 | 사용자의 문서를 실제로 저장하는 노드 |
| 인제스트 | 사용자의 문서가 저장되기 전, 문서 내용을 사전 처리하는 노드 |
| 코디네이트 | 사용자의 요청을 데이터 노드로 전달하고, 다시 데이터 노드로부터 결과를 취합하는 노드 |
[ 인덱스와 타입 ]
인덱스란 데이터가 저장되는 논리적인 공간을 의미하며,
타입은 인덱스 안의 데이터를 유형별로 논리적으로 나눠 놓은 공간을 의미
RDBMS와 비교하면 아래와 같다.
| ElasticSearch | RDBMS |
| 인덱스 | 데이터베이스 |
| 타입 | 테이블 |
앞서 말했듯이, ElasticSearch 6.x 버전 이후로는 하나의 인덱스에 하나의 타입만 가질 수 있다. 즉, 인덱스의 이름은 클러스터 내에서 유일해야하며, 동일한 이름의 다른 인덱스를 만들 수는 없다.
📢 멀티타입을 허용하지 않는 이유 중 하나는 인덱스에 존재하는 서로 다른 타입에서 동일한 이름의 JSON 문서 필드를 만들 수 있어서 의도치 않은 검색 결과가 나타나는 문제가 발생하기 때문이다.
[ 샤드와 세그먼트 ]
❓ 샤드
인덱스에 색인되는 문서들이 저장되는 논리적인 공간
❓ 세그먼트
샤드의 데이터들을 가지고 있는 물리적인 파일

그림에서 보면 인덱스는 다수의 샤드로 구성되고, 하나의 샤드는 다수의 세그먼트로 구성된다.
인덱스를 샤드로 나누고 데이터 노드에 샤드를 할당하며, 원본인 프라이머리 샤드와 복제본인 레플리카 샤드로 구성된다. 복제본을 통해 데이터의 안정성을 보장한다. 레플리카 샤드가 많을 수록 검색 요청에 대한 응답 속도를 높일 수 있다. 기본적으로 원본과 복제본은 동일한 노드에 존재하지 않고, 기본적으로 복제본은 1로 설정되어 있다.
세그먼트는 불변의 특성을 갖고 있어서 기존 문서가 수정되면 버전이 올라가며 기존 문서는 불용 처리가 되고, 새로운 문서가 색인된다.

시간이 지나면 여러 개의 세그먼트로 사용자의 문서를 색인하며, 작은 크기의 세그먼트들이 늘어난다. 이로 인해 문서를 검색할 때마다 많은 수의 세그먼트들이 응답해야하는 단점이 생긴다. 이를 보완하기 위해 백그라운드에서 세그먼트 병합을 진행한다.

[ 매핑 ]
RDBMS와 비교하면 '스키마'와 유사하다. JSON 문서들이 어떤 키와 형태의 값을 가지고 있는지 정의한 것이다.
| 코어 데이터 타입 | 설명 | 종류 |
| String | 문자열 데이터 타입 | text, keyword |
| Numeric | 숫자형 데이터 타입 | long, integer, short, byte, double, float, half_float, scaled_float |
| Date | 날짜형 데이터 타입 | date |
| Boolean | 불 데이터 타입 | boolean |
| Binary | 바이너리 데이터 타입 | binary |
| Range | 범주 데이터 타입 | integer_range, float_range, long_range, double_range, date_range |
ex) mapping 예시
PUT /my-books
{
"mappings": {
"properties": {
"title": {
"type": "text", // 전문 검색을 위한 타입
"analyzer": "nori" // 형태소 분석기 (한국어 예시)
},
"author": {
"type": "keyword" // 정확한 일치를 위한 타입
},
"publish_date": {
"type": "date", // 날짜 타입
"format": "yyyy-MM-dd" // 날짜 형식 지정
},
"pages": {
"type": "long" // 정수 타입
},
"tags": {
"type": "keyword" // 배열 형태의 키워드
}
}
}
}
📚 정리
ElasticSearch의 정의, 구성 요소, 문서들이 색인되는 과정과 기본 개념들에 대해 공부할 수 있었다. 특히, 검색 엔진이 어떻게 동작하는지 간단하게 알 수 있었다. 이후 챕터에서는 클러스터 구축과 운영이 있는데 이 부분은 포스팅하지 않고 최적화와 엔진 활용에 대해 공부해서 포스팅할 계획이다.
'Developer's_til > 그외 개발 공부' 카테고리의 다른 글
| [ELK] 클러스터 성능, 모니터링과 최적화 (0) | 2025.12.30 |
|---|---|
| [리액트] 렌더링되는 과정과 예시 (0) | 2025.10.19 |
| [Java] Json을 활용하는 구글의 오픈소스 Gson (1) | 2022.01.05 |
| [Java] Optional이란? 개념과 사용법 - 1 (2) | 2022.01.03 |
| [Design Pattern] 컴포지트 패턴(Composite Pattern)이란 (0) | 2021.12.31 |