![[ElasticSearch] 인덱스, 도큐먼트, 매핑, 필드](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoTohm%2FbtsOkSSVIc1%2Fz9aM8MzlT1ZrigyFQctYv1%2Fimg.png)
[ElasticSearch] 인덱스, 도큐먼트, 매핑, 필드Back-End/ElasticSearch2025. 5. 30. 14:31
Table of Contents
이 글은 인프런의 지식 공유자 박재성님의 강의를 듣고 개인적으로 정리하는 글임을 알립니다.
Elasticsearch의 기본 용어 정리
MySQL과 Elasticsearch를 비교하면서 학습하면 Elasticsearch를 훨씬 빠르게 배울 수 있다.
MySQL
- MySQL은 데이터베이스이다.
- 데이터를 저장/조회/수정/삭제할 수 있다.
- 데이터를 저장하기 위해 가장 먼저 테이블(table)을 만든다.
- 테이블을 만들 때 어떤 유형의 데이터를 넣을 지 스키마(schema)를 정의한다.
- 테이블의 컬럼(column)에 맞게 데이터를 저장한다.
Elasticsearch
- Elasticsearch도 데이터베이스다.
- Elasticsearch에 데이터를 저장/조회/수정/삭제할 수 있다.
- 데이터를 저장하기 위해 가장 먼저 인덱스(index)를 만든다.
- 인덱스를 만들 때 어떤 유형의 데이터를 넣을 지 매핑(mapping)을 정의한다.
- 테이블의 필드(field)에 맞게 데이터를 저장한다.
MySQL | Elasticsearch |
테이블(table) | 인덱스(index) |
컬럼(column) | 필드(field) |
레코드(record), 로우(row) | 도큐먼트(document) |
스키마(schema) | 매핑(mapping) |
‘MySQL에서의 인덱스(index)’와 ‘Elasticsearch의 인덱스(index)’는 완전 별개의 개념이다.
인덱스 생성 / 삭제
인덱스 생성
# 인덱스 생성 # PUT /{인덱스명} PUT /users # 인덱스 생성됐는 지 확인하기 # GET /{인덱스명} GET /users # 없는 인덱스를 조회했을 때 응답값 확인하기 GET /abc |
인덱스 삭제
# 인덱스 생성 PUT /boards # 인덱스 생성됐는 지 확인하기 GET /boards # 인덱스 삭제 # DELETE /{인덱스명} DELETE /boards # 삭제됐는 지 확인하기 GET /boards |
매핑(mapping) 정의
Elasticsearch에서 매핑(mapping)을 정의하는 건 MySQL에서 테이블의 스키마(schema)를 정의하는 것과 같다.
# 매핑 정의하기 # PUT /{인덱스명}/_mappings PUT /users/_mappings { "properties": { "name": { "type": "keyword" }, "age": { "type": "integer" }, "is_active": { "type": "boolean" } } } # 정의한 매핑 확인하기 GET /users |
도큐먼트(document)
삽입
- Elasticsearch에서 도큐먼트(document)을 삽입하는 건 MySQL에서 테이블에 레코드(record)를 삽입하는 것과 같다.
id를 자동으로 생성해서 삽입
# 도큐먼트 삽입 # POST /{인덱스명}/_doc POST /users/_doc { "name": "Alice", "age": 28, "is_active": true } POST /users/_doc { "name": "Bob", "age": 30, "is_active": false } |
id를 직접 지정해서 삽입
# 도큐먼트 저장 (id 직접 지정) # POST /{인덱스명}/_create/{id} POST /users/_create/1 { "name": "jscode", "age": 30, "is_active": true } # 잘 저장됐는 지 확인하기 GET /users/_search # 이미 존재하는 id로 데이터 저장하면 어떻게 되는 지 확인하기 POST /users/_create/1 { "name": "jscode", "age": 30, "is_active": true } |
id를 직접 지정해서 저장 (이미 id가 존재한다면 데이터 덮어씌움) = UPSERT
# 도큐먼트 저장 및 업데이트 # PUT /{인덱스명}/_doc/{id} PUT /users/_doc/2 { "name": "jason", "age": 30, "is_active": true } # 잘 저장됐는 지 확인하기 GET /users/_search # 이미 존재하는 id로 데이터 저장하면 어떻게 되는 지 확인하기 POST /users/_doc/2 { "name": "jason2", "age": 30, "is_active": true } # 어떻게 됐는 지 확인하기 GET /users/_search |
HTTP 메서드가 POST가 아니라 PUT임에 주의
조회
(특정 인덱스의) 모든 도큐먼트 조회
# 모든 도큐먼트 조회 # GET /{인덱스명}/_search GET /users/_search |
id로 특정 도큐먼트 조회
# 특정 도큐먼트 조회 # GET /{index}/_doc/{id} GET /users/_doc/1 GET /users/_doc/2 |
도큐먼트 조회시 응답값
{ "took": 1, "timed_out": false, "_shards": { "total": 1, "successful": 1, "skipped": 0, "failed": 0 }, "hits": { "total": { "value": 2, "relation": "eq" }, "max_score": 1, "hits": [ { # _index : 인덱스명 "_index": "users", # 데이터를 저장하면서 자동으로 생성된 '랜덤 고유 ID' "_id": "0imoJ5YBVwYHNUofQSQc", "_score": 1, # _source : 저장한 데이터가 들어있는 필드 "_source": { "name": "Alice", "age": 28, "is_active": true } }, { "_index": "users", "_id": "0ymoJ5YBVwYHNUofRSRX", "_score": 1, "_source": { "name": "Bob", "age": 30, "is_active": false } } ] } } |
수정
도큐먼트를 통째로 덮어씌우기
# 특정 도큐먼트 수정 # 이 API는 데이터 저장 시에도 사용하는 API이다. (바로 위에서 언급했었음) # PUT /{인덱스명}/_doc/{id} PUT /users/_doc/1 { "name": "new" } # 수정됐는 지 확인하기 GET /users/_doc/1 |
일부 필드만 수정
# 특정 도큐먼트 수정 # POST /{인덱스명}/_update/{id} POST /users/_update/2 { "doc": { "age": 10, "is_active": false } } # 수정됐는 지 확인하기 GET /users/_doc/2 |
삭제
# id로 도큐먼트 삭제하기 # DELETE /{인덱스명}/_doc/{id} DELETE /users/_doc/2 # 삭제됐는 지 확인하기 GET /users/_doc/2 |
'Back-End > ElasticSearch' 카테고리의 다른 글
[ElasticSearch] 데이터 타입(data type)과 매핑(mapping) (0) | 2025.05.31 |
---|---|
[ElasticSearch] 애널라이저(Analyzer) (0) | 2025.05.31 |
[ElasticSearch] 역인덱스(Inverted Index) (0) | 2025.05.31 |
[ElasticSearch] 작동 방식 및 Kibana (0) | 2025.05.30 |
[ElasticSearch] 기본 개념 및 설치 방법 (0) | 2025.05.30 |