인프런-실전에서 바로 써먹는 Elasticsearch 입문(검색 최적화편)을 듣고 작성한 글입니다.
Elasticsearch의 기본 용어 (vs MySQL)
Elasticsearch 특징
- 데이터베이스
- 데이터를 저장/조회/수정/삭제할 수 있음.
- 데이터를 저장하기 위해 가장 먼저 인덱스를 만듬
- 인덱스를 만들 때 어떤 유형의 데이터를 넣을 지 매핑을 정의함.
- 테이블의 필드에 맞게 데이터를 저장함
MySQL 과 Elasticsearch 와 비교해서 이해하면 훨씬 쉽다.
| MySQL | Elasticsearch |
| 테이블(table) | 인덱스(index) |
| 컬럼(column) | 필드(field) |
| 레코드(record), 로우(row) | 도큐먼트(document) |
| 스키마(schema) | 매핑(mapping) |
Elasticsearch의 CRUD
1. 인덱스 생성
# PUT /{인덱스명}
PUT /users
2. 인덱스 조회
# 인덱스 생성됐는 지 확인하기
# GET /{인덱스명}
GET /users
결과


3. 인덱스 삭제
# DELETE /{인덱스명}
DELETE /boards
매핑 정의하기
매핑 정의는 MySQL에서 테이블의 스키마를 정의하는 것과 똑같다.
# PUT /{인덱스명}/_mappings
PUT /users/_mappings
{
"properties": {
"name": { "type": "keyword" },
"age": { "type": "integer" },
"is_active": { "type": "boolean" }
}
}
# 정의한 매핑 확인하기
GET /users
결과
{
"users": {
"aliases": {},
"mappings": {
"properties": {
"age": {
"type": "integer"
},
"is_active": {
"type": "boolean"
},
"name": {
"type": "keyword"
}
}
},
"settings": {
"index": {
"routing": {
"allocation": {
"include": {
"_tier_preference": "data_content"
}
}
},
"number_of_shards": "1",
"provided_name": "users",
"creation_date": "1781617207745",
"number_of_replicas": "1",
"uuid": "59cO7fyoRzKnqlhMnDSn2g",
"version": {
"created": "8521000"
}
}
}
}
}
도큐먼트 CRUD
도큐먼트 = 데이터라고 생각하면 된다.
1-1. 도큐먼트 삽입(랜덤 id)
# POST /{인덱스명}/_doc
POST /users/_doc
{
"name": "bob",
"age": 30,
"is_active": true
}
1-2. 도큐먼트 삽입(id 지정)
_create를 이용해서 도큐먼트를 삽입했을 시 똑같은 도큐먼트를 또 입력하면 입력 오류가 난다.
# POST /{인덱스명}/_create/{id}
POST /users/_create/1
{
"name": "jscode",
"age": 30,
"is_active": true
}
2-1. 모든 도큐먼트 조회
# GET /{인덱스명}/_search
GET /users/_search
응답 결과에 hits 부분을 보면 조회된 도큐먼트를 확인할 수 있다.

_id를 보면 랜덤으로 생성된 id와 지정한 id의 데이터들이 조회된 것을 확인할 수 있다.
_source : 삽입한 데이터의 원본
2-2. 특정 데이터 조회
# GET /{index}/_doc/{id}
GET /users/_doc/1
결과

3-1. 도큐먼트 수정(통째로)
수정이라 써놨지만, PUT은 입력의 기능도 한다.
처음으로 PUT /{인덱스명}/_doc/{id} 을 입력하면 결과에 "result" : "created가 뜨고
동일한 URL에 다른 내용의 도큐먼트를 다시 입력하게 되면 "result" : "updated"가 된다.
# PUT /{인덱스명}/_doc/{id}
PUT /users/_doc/1
{
"name": "new"
}
결과


_id 1의 데이터가 통째로 수정되었다.
3-2. 도큐먼트 수정(일부 필드)
# POST /{인덱스명}/_update/{id}
POST /users/_update/2
{
"doc": {
"age": 10,
"is_active": false
}
}
결과


_id 2의 데이터의 일부(name, is_active)값만 수정되었다.
4. 도큐먼트 삭제
# DELETE /{인덱스명}/_doc/{id}
DELETE /users/_doc/2
도큐먼트 CRUD 총 정리
도큐먼트 조회
| GET /{인덱스명}/_search | 모든 도큐먼트 조회 |
| GET /{index}/_doc/{id} | id로 특정 도큐먼트 조회 |
도큐먼트 저장과 수정
| POST /{인덱스명}/_doc | 도큐먼트 저장 (id 자동 생성) |
| POST /{인덱스명}/_create/{id} | 도큐먼트 저장 (id 직접 지정) |
| PUT /{인덱스명}/_doc/{id} | 특정 도큐먼트 통째로 수정(=UPSERT) |
| POST /{인덱스명}/_update/{id} | 특정 도큐먼트 일부 필드 수정 |
즉, 단순히 "저장"과 "수정"만 구분하는 것이 아니라, ID 생성 방식(자동/수동) 과 기존 데이터 처리 방식(생성만 가능, 전체 교체, 부분 수정) 에 따라 서로 다른 API를 제공한다.
또한 _create API는 POST뿐만 아니라 PUT /{index}/_create/{id} 형태로도 사용할 수 있으며, 두 방식 모두 이미 동일한 ID의 문서가 존재할 경우 생성에 실패한다. 다만, 처음 학습할 때는 위의 표 참고해 4가지 방식으로 구분하는게 좋을 것 같다.
https://esbook.kimjmin.net/04-data/4.2-crud#request-2
4.2 CRUD - 입력, 조회, 수정, 삭제 | Elastic 가이드북
이 문서의 허가되지 않은 무단 복제나 배포 및 출판을 금지합니다. 본 문서의 내용 및 도표 등을 인용하고자 하는 경우 출처를 명시하고 김종민(kimjmin@gmail.com)에게 사용 내용을 알려주시기 바랍
esbook.kimjmin.net
도큐먼트 삭제
| DELETE /{인덱스명}/_doc/{id} | 도큐먼트 삭제 |
'ELK' 카테고리의 다른 글
| [Elasticsearch] ElasticSearch, Kibana 설치하기 (4) | 2026.03.14 |
|---|---|
| [Elastic Stack] ELK Stack 기반 로그 모니터링 시스템 (2) | 2026.03.10 |