ElasticSearch ‐ ElasticSearch 기본 개념 - dnwls16071/Backend_Study_TIL GitHub Wiki
📚 ElasticSearch란?
- ElasticSearch는 오픈 소스 분산, Restful 검색 및 분석 엔진, 확장 가능한 데이터 저장소 및 벡터 데이터베이스를 말한다.
- 쉽게 말해 ElasticSearch는 검색, 데이터 분석에 최적화된 데이터베이스이다.
📚 ElasticSearch 주요 활용 사례
- 데이터 수집 및 분석
- ElasticSearch는 대규모 데이터를 수집 및 분석하는데 최적화되어 있다.
- 주로 ElasticSearch(데이터 저장), Logstash(데이터 수집 및 가공), Kibana(데이터 시각화)를 같이 활용해 데이터를 수집 및 분석한다,
- 검색 최적화
- ElasticSearch는 데이터가 많더라도 뛰어난 검색 속도를 가지고 있고, 오타나 동의어를 고려해서 유연하게 검색할 수 있는 기능을 가지고 있다.
📚 Docker로 ElasticSearch 사용하기
services:
elastic:
image: docker.elastic.co/elasticsearch/elasticsearch:8.17.4 # Elastic 8.17.4 버전의 이미지
ports:
- 9200:9200
environment:
### 아래 설정은 개발/테스트 환경에서 간단하게 테스트하기 위한 옵션 (운영 환경에서는 설정하면 안 됨)
- discovery.type=single-node # 단일 노드
- xpack.security.enabled=false # 보안 설정
- xpack.security.http.ssl.enabled=false # 보안 설정
📚 ElasticSearch GUI 툴 = Kibana
services:
elastic:
image: docker.elastic.co/elasticsearch/elasticsearch:8.17.4 # 8.17.4 버전
ports:
- 9200:9200 # 9200번 포트에서 Elasticsearch 실행
environment:
# 아래 설정은 개발/테스트 환경에서 간단하게 테스트하기 위한 옵션 (운영 환경에서는 설정하면 안 됨)
- discovery.type=single-node # 단일 노드 (지금은 알 필요 없음)
- xpack.security.enabled=false # 보안 설정
- xpack.security.http.ssl.enabled=false # 보안 설정
kibana:
image: docker.elastic.co/kibana/kibana:8.17.4 # 8.17.4 버전
ports:
- 5601:5601 # 5601번 포트에서 kibana 실행
environment:
- ELASTICSEARCH_HOSTS=http://elastic:9200 # kibana가 통신할 Elasticsearch 주소 알려주기
❗MySQL과 통신하려면 SQL을 사용하듯이 ElasticSearch와 통신하려면 REST API를 사용한다.
📚 ElasticSearch의 기본 용어 정리
- 데이터를 저장하기 위해 인덱스(Index)를 만든다.
- 인덱스를 만들 때 어떤 유형의 데이터를 넣을지 매핑(Mapping)을 정의한다.
- 테이블 필드(Field)에 맞게끔 데이터를 저장한다.
MySQL | ElasticSearch |
---|---|
테이블(Table) | 인덱스(Index) |
컬럼(Column) | 필드(Field) |
레코드(Record), 로우(Row) | 도큐먼트(Document) |
스키마(Schema) | 매핑(Mapping) |
📚 인덱스 생성 / 매핑 정의 / 도큐먼트 삽입
[인덱스 생성 및 조회]
# 인덱스 생성
# PUT /{인덱스명}
PUT /users
# 인덱스 생성됐는 지 확인하기
# GET /{인덱스명}
GET /users
# 없는 인덱스를 조회했을 때 응답값 확인하기
GET /abc
[인덱스 삭제]
# 인덱스 생성
PUT /boards
# 인덱스 생성됐는 지 확인하기
GET /boards
# 인덱스 삭제
# DELETE /{인덱스명}
DELETE /boards
# 삭제됐는 지 확인하기
GET /boards
[매핑 정의]
# 매핑 정의하기
# PUT /{인덱스명}/_mappings
PUT /users/_mappings
{
"properties": {
"name": { "type": "keyword" },
"age": { "type": "integer" },
"is_active": { "type": "boolean" }
}
}
# 정의한 매핑 확인하기
GET /users
매핑(Mapping)은 MySQL에서 테이블 스키마를 정의하는 것과 같다.
[도큐먼트 삽입 및 조회]
# 도큐먼트 삽입
# POST /{인덱스명}/_doc
POST /users/_doc
{
"name": "Alice",
"age": 28,
"is_active": true
}
POST /users/_doc
{
"name": "Bob",
"age": 30,
"is_active": false
}
# 모든 도큐먼트 조회
# GET /{인덱스명}/_search
GET /users/_search
도큐먼트를 삽입하는 것은 MySQL에서 테이블의 레코드를 삽입하는 것과 같다.
// 도큐먼트 조회 시 응답값
{
"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
}
}
]
}
}
📚 도큐먼트 CRUD
[도큐먼트 저장]
- id를 자동으로 생성해서 저장하는 방법
- id를 직접 지정해서 저장하는 방법
- id를 직접 지정해서 저장하는 방법(이미 id가 존재한다면 데이터를 덮어 씌움)
# 도큐먼트 저장 (id 자동 생성)
# POST /{인덱스명}/_doc
POST /users/_doc
{
"name": "Jaeseong",
"age": 20,
"is_active": true
}
# 잘 저장됐는 지 확인하기
GET /users/_search
# 도큐먼트 저장 (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
}
# 도큐먼트 저장 및 업데이트
# 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
[도큐먼트 조회]
- 특정 인덱스의 모든 도큐먼트 조회
- id로 특정 도큐먼트 조회
# GET /{인덱스명}/_search
GET /users/_search
# 특정 도큐먼트 조회
# GET /{index}/_doc/{id}
GET /users/_doc/1
GET /users/_doc/2
[도큐먼트 수정]
- 도큐먼트를 통째로 덮어씌우기
- 일부 필드만 수정
# 기존 도큐먼트 확인
GET /users/_doc/1
# 특정 도큐먼트 수정
# 이 API는 데이터 저장 시에도 사용하는 API이다. (바로 위에서 언급했었음)
# PUT /{인덱스명}/_doc/{id}
PUT /users/_doc/1
{
"name": "new"
}
# 수정됐는 지 확인하기
GET /users/_doc/1
# 기존 도큐먼트 확인
GET /users/_doc/2
# 특정 도큐먼트 수정
# POST /{인덱스명}/_update/{id}
POST /users/_update/2
{
"doc": {
"age": 10,
"is_active": false
}
}
# 수정됐는 지 확인하기
GET /users/_doc/2
[도큐먼트 삭제]
# 기존 도큐먼트 확인
GET /users/_doc/2
# id로 도큐먼트 삭제하기
# DELETE /{인덱스명}/_doc/{id}
DELETE /users/_doc/2
# 삭제됐는 지 확인하기
GET /users/_doc/2