
본 포스팅은 인프런 JSCODE 박재성님의 실전에서 바로 써먹는 Elasticsearch 입문 (검색 최적화편)
강의를 들은 후 해당 강의를 참고하여 작성되었습니다.
https://inf.run/767Nk
Elasticsearch is an open source, distributed search and analytics engine built for speed, scale, and AI applications. As a retrieval platform, it stores structured, unstructured, and vector data in real time — delivering fast hybrid and vector search, powering observability and security analytics, and enabling AI-driven applications with high performance, accuracy, and relevance.
-> Elasticsearch는 속도, 확장성 및 AI 애플리케이션을 위해 구축된 오픈 소스 분산형 검색 및 분석 엔진입니다... (이하 생략)

MYSQL과 소통하기 위해서는 SQL문을 작성하여 소통하는것 처럼
ElasticSearch와 소통하기 위해서는 ES QueryDSL을 생성해야 하는데,
소통의 방식으로 REST API를 사용한다.
INSERT INTO users (name,age) VALUES ("박하나", 22);
curl -X POST "http://localhost:9200/users/_doc" \
-H "Content-Type: application/json" \
-d '{
"name": "박하나",
"age": 26
}'
SELECT * FROM users;
curl -X GET "http://localhost:9200/users/_search" \
-H "Content-Type: application/json" \
-d '{
"query": {
"match_all": {}
}
}'

MYSQL에서 모든 쿼리를 일일히 콘솔로 입력하기는 힘들다.
그래서 DataGrip, workbench등을 사용하는데
마찬가지로 ElasticSearch에서도 Kibana를 이용하여 어떤 쿼리와 동작을 훨씬 쉽게 알 수 있다.
데이터를 저장/조회/수정/삭제 할 수 있다.
데이터를 저장하기 위해 가장 먼저 테이블(table)을 만든다.
테이블을 만들 때 어떤 유형의 데이터를 넣을 지 스키마(schema)를 정의한다.
테이블의 컬럼(column)에 맞게 데이터를 저장한다.
데이터를 저장/조회/수정/삭제 할 수있다.
데이터를 저장하기 위해 가장 먼저 인덱스(index)를 만든다
인덱스를 만들 때 어떤 유형의 데이터를 넣을지 매핑(mapping)을 정의한다
테이블의 필드(field)에 맞게 데이터를 저장한다.
| MYSQL | ElasticSearch |
|---|---|
| 테이블(table) | 인덱스(index) |
| 컬럼(column) | 필드(field) |
| 레코드(record), 로우(row) | 도큐먼트(document) |
| 스키마(schema) | 매핑(mapping) |
MySQL에서 테이블을 생성하는것과 같다.
# 인덱스 생성
# PUT /{인덱스명}
PUT /users
# 인덱스 조회
# GET /{인덱스명}
GET /users
# 인덱스 삭제
# DELETE /{인덱스명}
DELETE /users
MySQL에서 테이블의 스키마를 정의하는것과 같다
# 매핑 정의하기
# PUT /{인덱스명}/_mappings
PUT /users/_mappings
{
"properties" : {
"name" : {"type": "keyword"},
"age" : {"type": "integer"},
"is_active" : {"type": "boolean"}
}
}
MySQL에서 테이블에 record를 삽입하는 것과 같다
# 도큐먼트 삽입하기 - 1 (id 자동 생성)
# POST /{인덱스명}/_doc
POST /users/_doc
{
"name": "박하나",
"age": 26,
"is_active": ture
}
# 도큐먼트 삽입하기 - 2 (id 직접 지정)
# POST /{인덱스명}/_create/{id}
POST /users/_create/1
{
"name": "신세경",
"age": 34,
"is_active": true
}
# 도큐먼트 삽입하기 -3 (id 직접 지정 + id중복시 overwrite)
# PUT /{인덱스명}/_doc/{id}
PUT /users/_doc/1
{
"name": "박하나",
"age": 27,
"is_active": ture
}
# 도큐먼트 수정하기 -1 (완전히 overwrite)
# PUT /{인덱스명}/_doc/{id}
PUT /users/_doc/1
{
"name": "신세경",
}
# -> 기존 필드가 전부 다 날아가고 덮어쓰기 되니 사용에 주의
# 도큐먼트 수정하기 -2 (지정한 필드만 수정)
# POST /users/_update/{id}
POST /users/_update/1
{
"name":"신세경"
}
# id로 삭제하기
# DELETE /{인덱스명}/_doc/{id}
DELETE /users/_doc/1