✅ Elasticsearch
✅ 용도
Elasticsearch
는 크게 데이터 수집 및 분석, 검색 최적화 이렇게 두가지 용도로 사용한다데이터 수집 및 분석
검색 최적화
✅ Elasticsearch
작동 방식
일반 데이터베이스 (MySQL, ORACLE 등)는 SQL문으로 통신을 해야한다
하지만 Elasticsearch
데이터베이스는 REST API
방식으로 통신을 해야한다 (만든 사람 마음)
EX) 일반 DB에서 데이터 삽입과 조회할 때
INSERT INTO users (name, email) VALUES ('Alice', 'alice@example.com');
SELECT * FROM users;
EX) Elasticsearch
에서 데이터 삽입과, 조회할 때
curl -X POST "localhost:9200/users/_doc" -H 'Content-Type: application/json' -d'
{
"name": "Alice",
"email": "alice@example.com"
}'
curl -X GET "localhost:9200/users/_search" -H 'Content-Type: application/json' -d'
{
"query": {
"match_all": {}
}
}'
일반 DB에서는 매번 CLI로 SQL문을 입력하기 불편해서 Dbeaver, Sql Developer 와 같은 GUI 툴을 활용한다
Elasticsearch
에서도 매번 API 요청을 보내기 불편하기 때문에 GUI 툴이 존재한다 -> Kibana
도커를 사용하면 Elasticsearch
와 kibana
컨테이너를 각각 띄워서 편하게 사용할 수 있다
Kibana, Elasticsearch 아키텍처 -> kibana를 사용하여 엘라스틱서치를 조작할 수 있음
✅ RDBMS와 Elasticsearch 차이
사진처럼 두개의 차이는 명칭에서 다르다
참고로 RDBMS의 인덱스와 Elasticsearch의 인덱스는 다르다
✅ Elasticsearch
에서 인덱스 생성 = RDBMS에서 테이블 생성
인덱스 생성
PUT /{인덱스명}
EX) PUT /users
인덱스 조회
GET /{인덱스명}
💡 되도록이면 뒤에 _search 를 붙여서 사용하자 -> GET /{인덱스명}/_search
EX) GET /users/_search
생성하지 않은 인덱스를 조회하면 index_not_found_exception
발생
DELETE /{인덱스명}
DELETE /{users}
index_not_found_exception
발생✅ Elasticsearch
에서 매핑
을 정의 = RDBMS에서 테이블의 스키마 정의
인덱스
를 반드시 생성해야함PUT /{인덱스명}/_mappings
// EX
PUT /users/_mappings
{
"properties": {
"name": { "type": "keyword" }, // 문자열
"age": { "type": "integer" }, // 정수형
"is_active": { "type": "boolean" } // 불린형
}
}
✅ Elasticsearch
에서 도큐먼트
삽입 = RDBMS에서 테이블에 데이터를 삽입
도큐먼트
를 삽입하기전에 반드시 인덱스 생성
은 해야함도큐먼트
를 삽입하기전에 매핑
을 하지 않아도 자동으로 타입 추론하여 매핑을 생성함매핑
한 후 도큐먼트
를 삽입하자POST /{인덱스명}/_doc
// 도큐먼트 저장 (id 자동 생성)
POST /users/_doc
{
"name": "Alice",
"age": 28,
"is_active": true
}
POST /{인덱스명}/_create/{id}
// 도큐먼트 저장 (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 /{인덱스명}/_search
= ex) GET /users/_search
GET /{인덱스명}/_doc/{id}
= ex) GET /users/_doc/1
도큐먼트를 통째로 덮어쒸우기 = PUT /{인덱스명}/_doc/{id}
= ex)
PUT /users/_doc/1
{
"name": "new"
}
특정 도큐먼트만 수정하기 = # POST /{인덱스명}/_update/{id}
= ex )
POST /users/_update/2
{
"doc": {
"age": 10,
"is_active": false
}
}
DELETE /{인덱스명}/_doc/{id}
DELETE /users/_doc/2