
Elasticsearch는 검색과 데이터 분석에 최적화된 데이터베이스입니다.
이제 그 구조와 특징을 조금 더 자세히 알아보겠습니다.
Elasticsearch의 활용은 크게 데이터 수집 및 분석, 그리고 검색 시각화로 나눌 수 있습니다.
1) 데이터 수집 및 분석
ELK Stack = Elasticsearch + Logstash + Kibana
데이터를 수집하고, 가공하여 저장하고, 시각화하는 전체 과정을 ELK Stack으로 구성합니다.
데이터 흐름
: 수집 (Logstash) → 저장·검색 (Elasticsearch) → 시각화·통합 분석 (Kibana)
| 구성 요소 | 역할 | 설명 |
|---|---|---|
| Elasticsearch | 데이터 저장 및 검색 | 데이터를 분산 저장하고 인덱싱을 통해 빠른 검색 수행 |
| Logstash | 데이터 수집 및 가공 | 로그나 이벤트 데이터를 수집 및 변환 후 Elasticsearch로 전달 |
| Kibana | 데이터 시각화 | Elasticsearch 데이터를 시각적으로 표현 (대시보드 제공) |
2) 검색 시각화
오타나 동의어를 고려해 검색 결과를 제공하므로, 사용자가 의도한 정보를 더욱 정확하게 찾을 수 있습니다.
이제 위 활용 중 검색 시각화 부분에 좀 더 초점을 맞춰 살펴보겠습니다.
MySQL과 통신하려면 SQL 문법을 사용해야 합니다.
마찬가지로 Elasticsearch는 REST API 방식으로 요청을 주고받습니다.

Elasticsearch는 기본적으로 CLI나 REST API를 통해 데이터를 다루지만,
이를 GUI 환경에서 시각적으로 확인하고 관리할 수 있도록 도와주는 도구가 Kibana입니다.
| 구성 요소 | 설명 |
|---|---|
| 개발자 | 브라우저를 통해 Kibana에 접근 (localhost:5601) |
| Kibana | Elasticsearch와 연결되어 데이터를 시각적으로 표현 |
| Elasticsearch | 실제 데이터가 저장되고, Kibana에서 조회/분석 요청을 받음 |

MySQL과 비교하면서 Elasticsearch의 주요 용어를 정리해보겠습니다.
두 시스템은 구조와 접근 방식이 다르지만, 개념적으로 유사한 부분이 많기 때문에 비교를 통해 Elasticsearch의 기본 개념을 쉽게 이해할 수 있습니다.
| MySQL | Elasticsearch |
|---|---|
| 테이블 (table) | 인덱스 (index) |
| 컬럼 (column) | 필드 (field) |
| 레코드 (record), 로우 (row) | 도큐먼트 (document) |
| 스키마 (schema) | 매핑 (mapping) |

Elasticsearch에서는 데이터를 저장하기 전, 인덱스를 생성하고 매핑을 정의한 뒤 도큐먼트를 삽입하는 순서로 진행됩니다.
PUT /users
MySQL의 테이블(table)과 같은 개념인 users 인덱스를 생성합니다.
GET /users
생성된 users 인덱스의 정보를 조회합니다.
DELETE /users
users 인덱스를 삭제합니다.
Elasticsearch의
keyword타입은 MySQL의VARCHAR(문자열)과 유사하지만, 분석되지 않아 정확히 일치하는 값 검색에 사용됩니다.
PUT /users/_mapping
{
"properties": {
"name": { "type": "keyword" },
"age": { "type": "integer" },
"is_active": { "type": "boolean" }
}
}
인덱스에 저장될 필드의 데이터 타입을 정의하며, 이는 MySQL의 스키마(schema)와 유사하고 properties 내부에 각 필드명과 타입을 지정합니다.
GET /users
매핑 정보가 포함된 인덱스의 구조를 조회할 수 있습니다.
POST /users/_doc
{
"name": "Alice",
"age": 28,
"is_active": true
}
users 인덱스에 실제 데이터를 추가하며, 도큐먼트(Document)는 MySQL의 레코드(row)에 해당하고 각 데이터는 고유한 랜덤 ID로 저장됩니다.
GET /users/_search
인덱스 내 모든 데이터를 조회하면, 결과는 _hits 배열 안에 저장된 형태로 반환되며 각 결과에는 _source 필드가 포함되어 삽입한 실제 데이터(JSON)가 표시됩니다.
| 정리
| 단계 | 주요 명령어 | 설명 |
|---|---|---|
| 1) 인덱스 생성 | PUT /{index_name} | 데이터 저장 공간 생성 |
| 2) 매핑 정의 | PUT /{index_name}/_mapping | 필드 구조 및 타입 정의 |
| 3) 도큐먼트 삽입 | POST /{index_name}/_doc | 실제 데이터 등록 |
| 4) 데이터 조회 | GET /{index_name}/_search | 데이터 검색 및 확인 |
위와 같이, Elasticsearch에서 데이터를 다루는 기본 흐름은
인덱스 생성 → 매핑 정의 → 도큐먼트 삽입 → 데이터 조회 순으로 진행됩니다.
Elasticsearch에서의 도큐먼트(Document) 는 MySQL의 레코드(Row) 에 해당하며,
CRUD(Create, Read, Update, Delete) 요청은 모두 REST API 형태로 수행됩니다.
도큐먼트는 세 가지 방식으로 저장할 수 있습니다.
1) 랜덤 ID로 저장
POST /users/_doc
{
"name": "Alice",
"age": 28,
"is_active": true
}
도큐먼트를 저장하면, Elasticsearch가 자동으로 랜덤 ID를 생성하여 _id 필드에 부여합니다.
2) ID를 지정하여 저장
POST /users/_create/1
{
"name": "JSCode",
"age": 30,
"is_active": true
}
/_create/{id} 형태로 직접 ID를 지정하여 도큐먼트를 저장할 수 있습니다.
이미 존재하는 ID로 저장을 시도하면 오류가 발생하며(중복 불가), 결과는 _id: 1과 같이 지정한 ID로 저장됩니다.
3) 저장 + 수정(Upsert)
PUT /users/_doc/2
{
"name": "Jason",
"age": 30,
"is_active": true
}
해당 ID가 없으면 새로 생성하고, 존재하면 데이터를 덮어씁니다(업데이트).
즉, 저장(Create)과 수정(Update)을 동시에 수행하는 요청입니다.
비교 ) 도큐먼트 POST vs PUT 차이
| 메서드 | 설명 |
|---|---|
| POST /{index_name}/_doc | ID를 지정하지 않으면 랜덤 ID로 새 도큐먼트 생성 |
| POST /{index_name}/_create/{id} | 지정한 ID로만 생성, 이미 존재하면 에러 발생 |
| PUT /{index_name}/_doc/{id} | ID가 없으면 생성, 있으면 수정(덮어쓰기) |
도큐먼트 데이터를 조회하는 방법은 두 가지입니다.
1) 전체 조회
GET /users/_search
인덱스 내의 모든 데이터를 조회합니다.
조회 결과는 _hits 배열에 담겨 반환되며, 각 항목의 _source 필드 안에 실제 데이터(JSON)가 표시됩니다.
2) 특정 ID 조회
GET /users/_doc/1
특정 _id 에 해당하는 도큐먼트만 조회합니다.
특정 필드 값만 부분적으로 수정할 수 있습니다.
POST /users/_update/2
{
"doc": {
"age": 40,
"is_active": false
}
}
doc 객체 내부에는 변경할 필드만 명시합니다.
전체 도큐먼트를 대체하지 않고, 지정한 필드만 부분적으로 수정됩니다.
특정 도큐먼트를 삭제합니다.
DELETE /users/_doc/2
_id가 2인 도큐먼트를 삭제합니다.
요청이 성공하면 result: deleted 응답이 반환됩니다.
| 정리
| 구분 | 요청 방식 | 설명 |
|---|---|---|
| 저장 (Create) | POST /{index_name}/_create/1 | ID를 지정해 새 도큐먼트 생성 |
| 조회 (Read) | GET /{index_name}/_search | 인덱스 내 전체 도큐먼트 조회 |
| 수정 (Update) | POST /{index_name}/_update/2 | 특정 필드값만 수정 |
| 삭제 (Delete) | DELETE /{index_name}/_doc/2 | 특정 ID의 도큐먼트 삭제 |
https://www.youtube.com/watch?v=3oSmBZEQksA&list=PLtUgHNmvcs6r7MnYw3EbVF5hdhaCqSTmv&index=2