Elasticsearch에 대해서

yedi·2025년 10월 9일
post-thumbnail

Elasticsearch는 검색과 데이터 분석에 최적화된 데이터베이스입니다.
이제 그 구조와 특징을 조금 더 자세히 알아보겠습니다.


Elasticsearch

활용

Elasticsearch의 활용은 크게 데이터 수집 및 분석, 그리고 검색 시각화로 나눌 수 있습니다.

1) 데이터 수집 및 분석

ELK Stack = Elasticsearch + Logstash + Kibana

데이터를 수집하고, 가공하여 저장하고, 시각화하는 전체 과정을 ELK Stack으로 구성합니다.

데이터 흐름
: 수집 (Logstash) → 저장·검색 (Elasticsearch) → 시각화·통합 분석 (Kibana)

구성 요소 역할 설명
Elasticsearch 데이터 저장 및 검색 데이터를 분산 저장하고 인덱싱을 통해 빠른 검색 수행
Logstash 데이터 수집 및 가공 로그나 이벤트 데이터를 수집 및 변환 후 Elasticsearch로 전달
Kibana 데이터 시각화 Elasticsearch 데이터를 시각적으로 표현 (대시보드 제공)

2) 검색 시각화

오타나 동의어를 고려해 검색 결과를 제공하므로, 사용자가 의도한 정보를 더욱 정확하게 찾을 수 있습니다.

이제 위 활용 중 검색 시각화 부분에 좀 더 초점을 맞춰 살펴보겠습니다.


작동 방식

MySQL과 통신하려면 SQL 문법을 사용해야 합니다.
마찬가지로 Elasticsearch는 REST API 방식으로 요청을 주고받습니다.



GUI 툴

Elasticsearch는 기본적으로 CLI나 REST API를 통해 데이터를 다루지만,
이를 GUI 환경에서 시각적으로 확인하고 관리할 수 있도록 도와주는 도구가 Kibana입니다.

구성 요소 설명
개발자 브라우저를 통해 Kibana에 접근 (localhost:5601)
Kibana Elasticsearch와 연결되어 데이터를 시각적으로 표현
Elasticsearch 실제 데이터가 저장되고, Kibana에서 조회/분석 요청을 받음



기본 용어 정리

MySQL과 비교하면서 Elasticsearch의 주요 용어를 정리해보겠습니다.
두 시스템은 구조와 접근 방식이 다르지만, 개념적으로 유사한 부분이 많기 때문에 비교를 통해 Elasticsearch의 기본 개념을 쉽게 이해할 수 있습니다.

MySQL Elasticsearch
테이블 (table) 인덱스 (index)
컬럼 (column) 필드 (field)
레코드 (record), 로우 (row) 도큐먼트 (document)
스키마 (schema) 매핑 (mapping)



실전 1 ) 인덱스 생성, 매핑 정의, 도큐먼트 삽입

Elasticsearch에서는 데이터를 저장하기 전, 인덱스를 생성하고 매핑을 정의한 뒤 도큐먼트를 삽입하는 순서로 진행됩니다.

| 인덱스 생성

PUT /users

MySQL의 테이블(table)과 같은 개념인 users 인덱스를 생성합니다.

| 인덱스 조회

GET /users

생성된 users 인덱스의 정보를 조회합니다.

| 인덱스 삭제

DELETE /users

users 인덱스를 삭제합니다.


| 매핑 정의

Elasticsearch의 keyword 타입은 MySQL의 VARCHAR(문자열)과 유사하지만, 분석되지 않아 정확히 일치하는 값 검색에 사용됩니다.

PUT /users/_mapping
{
  "properties": {
    "name":     { "type": "keyword" },
    "age":      { "type": "integer" },
    "is_active": { "type": "boolean" }
  }
}

인덱스에 저장될 필드의 데이터 타입을 정의하며, 이는 MySQL의 스키마(schema)와 유사하고 properties 내부에 각 필드명과 타입을 지정합니다.

| 매핑 조회

GET /users

매핑 정보가 포함된 인덱스의 구조를 조회할 수 있습니다.


| 도큐먼트 삽입

POST /users/_doc
{
  "name": "Alice",
  "age": 28,
  "is_active": true
}

users 인덱스에 실제 데이터를 추가하며, 도큐먼트(Document)는 MySQL의 레코드(row)에 해당하고 각 데이터는 고유한 랜덤 ID로 저장됩니다.

| 도큐먼트 조회

GET /users/_search

인덱스 내 모든 데이터를 조회하면, 결과는 _hits 배열 안에 저장된 형태로 반환되며 각 결과에는 _source 필드가 포함되어 삽입한 실제 데이터(JSON)가 표시됩니다.


| 정리

단계 주요 명령어 설명
1) 인덱스 생성 PUT /{index_name} 데이터 저장 공간 생성
2) 매핑 정의 PUT /{index_name}/_mapping 필드 구조 및 타입 정의
3) 도큐먼트 삽입 POST /{index_name}/_doc 실제 데이터 등록
4) 데이터 조회 GET /{index_name}/_search 데이터 검색 및 확인

위와 같이, Elasticsearch에서 데이터를 다루는 기본 흐름은
인덱스 생성 → 매핑 정의 → 도큐먼트 삽입 → 데이터 조회 순으로 진행됩니다.



실전 2 ) 도큐먼트 저장, 조회, 수정, 삭제

Elasticsearch에서의 도큐먼트(Document) 는 MySQL의 레코드(Row) 에 해당하며,
CRUD(Create, Read, Update, Delete) 요청은 모두 REST API 형태로 수행됩니다.

| 저장

도큐먼트는 세 가지 방식으로 저장할 수 있습니다.

1) 랜덤 ID로 저장

POST /users/_doc
{
  "name": "Alice",
  "age": 28,
  "is_active": true
}

도큐먼트를 저장하면, Elasticsearch가 자동으로 랜덤 ID를 생성하여 _id 필드에 부여합니다.

2) ID를 지정하여 저장

POST /users/_create/1
{
  "name": "JSCode",
  "age": 30,
  "is_active": true
}

/_create/{id} 형태로 직접 ID를 지정하여 도큐먼트를 저장할 수 있습니다.
이미 존재하는 ID로 저장을 시도하면 오류가 발생하며(중복 불가), 결과는 _id: 1과 같이 지정한 ID로 저장됩니다.

3) 저장 + 수정(Upsert)

PUT /users/_doc/2
{
  "name": "Jason",
  "age": 30,
  "is_active": true
}

해당 ID가 없으면 새로 생성하고, 존재하면 데이터를 덮어씁니다(업데이트).
즉, 저장(Create)과 수정(Update)을 동시에 수행하는 요청입니다.

비교 ) 도큐먼트 POST vs PUT 차이

메서드 설명
POST /{index_name}/_doc ID를 지정하지 않으면 랜덤 ID로 새 도큐먼트 생성
POST /{index_name}/_create/{id} 지정한 ID로만 생성, 이미 존재하면 에러 발생
PUT /{index_name}/_doc/{id} ID가 없으면 생성, 있으면 수정(덮어쓰기)

| 조회

도큐먼트 데이터를 조회하는 방법은 두 가지입니다.

1) 전체 조회

GET /users/_search

인덱스 내의 모든 데이터를 조회합니다.
조회 결과는 _hits 배열에 담겨 반환되며, 각 항목의 _source 필드 안에 실제 데이터(JSON)가 표시됩니다.

2) 특정 ID 조회

GET /users/_doc/1

특정 _id 에 해당하는 도큐먼트만 조회합니다.


| 수정

특정 필드 값만 부분적으로 수정할 수 있습니다.

POST /users/_update/2
{
  "doc": {
    "age": 40,
    "is_active": false
  }
}

doc 객체 내부에는 변경할 필드만 명시합니다.
전체 도큐먼트를 대체하지 않고, 지정한 필드만 부분적으로 수정됩니다.


| 삭제

특정 도큐먼트를 삭제합니다.

DELETE /users/_doc/2

_id가 2인 도큐먼트를 삭제합니다.
요청이 성공하면 result: deleted 응답이 반환됩니다.


| 정리

구분 요청 방식 설명
저장 (Create) POST /{index_name}/_create/1 ID를 지정해 새 도큐먼트 생성
조회 (Read) GET /{index_name}/_search 인덱스 내 전체 도큐먼트 조회
수정 (Update) POST /{index_name}/_update/2 특정 필드값만 수정
삭제 (Delete) DELETE /{index_name}/_doc/2 특정 ID의 도큐먼트 삭제


참고

https://www.youtube.com/watch?v=3oSmBZEQksA&list=PLtUgHNmvcs6r7MnYw3EbVF5hdhaCqSTmv&index=2

0개의 댓글