색인(Indexing)이란?

📌 Elasticsearch에서 색인(Indexing)은 데이터를 저장하고 검색할 수 있도록 변환하는 과정입니다.

  • RDBMS의 "INSERT"와 유사하지만, 단순 저장이 아닌 역색인(Inverted Index) 구조를 사용하여 빠른 검색을 지원.
  • 모든 데이터는 JSON 문서(Document) 형태로 저장됨.
  • 색인된 데이터는 샤드(Shard) 단위로 분산 저장됨.

문서 색인 (PUT /index/_doc/1)

Elasticsearch에서 데이터를 저장하는 기본 단위는 **문서(Document)**이며, JSON 형식으로 저장됩니다.

(1) 문서 색인 예제 (PUT)

PUT /products/_doc/1
{
  "name": "Elasticsearch 책",
  "category": "IT",
  "price": 30000,
  "stock": true,
  "release_date": "2023-06-01"
}

✅ products 인덱스에 ID가 1인 문서를 색인.


문서 검색 (GET /index/_search)

색인된 문서는 다양한 쿼리를 사용하여 검색할 수 있습니다.

(1) 전체 문서 검색

GET /products/_search

✅ products 인덱스의 모든 문서 검색.


(2) 특정 필드 검색 (Match Query)

GET /products/_search
{
  "query": {
    "match": {
      "name": "Elasticsearch"
    }
  }
}

"name" 필드에 "Elasticsearch"라는 단어가 포함된 문서 검색 (형태소 분석 적용).


(3) 정확한 단어 검색 (Term Query)

GET /products/_search
{
  "query": {
    "term": {
      "category": "IT"
    }
  }
}

✅ "category" 필드는 keyword 타입이므로 정확히 "IT"와 일치하는 문서만 반환.


(4) 여러 조건 검색 (Bool Query)

GET /products/_search
{
  "query": {
    "bool": {
      "must": [
        { "match": { "name": "Elasticsearch" } },
        { "term": { "category": "IT" } }
      ],
      "filter": [
        { "range": { "price": { "gte": 20000, "lte": 40000 } } }
      ]
    }
  }
}

bool 쿼리를 사용하여 여러 조건을 결합하여 검색 가능

  • "must" → 모든 조건을 만족하는 문서 반환.
  • "filter" → 가격이 20,000 ~ 40,000 사이인 문서 필터링 (랭킹 영향 없음).

문서 업데이트 및 삭제

색인된 문서는 업데이트(Update) 또는 삭제(Delete) 할 수 있습니다.

(1) 문서 업데이트 (POST /_update)

POST /products/_update/1
{
  "doc": {
    "price": 28000
  }
}

ID가 1인 문서의 price 값을 28000으로 변경.


(2) 여러 필드 업데이트

POST /products/_update/1
{
  "doc": {
    "price": 28000,
    "stock": false
  }
}

여러 필드를 동시에 업데이트 가능.


(3) 문서 삭제 (DELETE /_doc/1)

DELETE /products/_doc/1

ID가 1인 문서를 삭제.


Match, Term, Bool Query 기본 사용법

Elasticsearch에서는 다양한 검색 쿼리를 지원하며, 가장 기본적인 검색 방법은 다음과 같습니다.

(1) Match Query (전문 검색)

  • 텍스트 필드(text 타입)에 대해 형태소 분석을 수행한 후 검색.
  • 자연어 검색에 적합.
GET /products/_search
{
  "query": {
    "match": {
      "name": "Elasticsearch 책"
    }
  }
}

✅ "name" 필드에서 "Elasticsearch 책"과 관련된 문서를 검색.


(2) Term Query (정확한 값 검색)

  • keyword, integer, boolean 필드에 대해 정확한 일치 검색 수행.
  • 형태소 분석을 적용하지 않음.
GET /products/_search
{
  "query": {
    "term": {
      "category": "IT"
    }
  }
}

✅ "category" 필드 값이 정확히 "IT"인 문서만 검색.


(3) Bool Query (복합 검색)

  • 여러 개의 검색 조건을 조합할 때 사용.
  • must, should, must_not, filter 조건을 조합 가능.
GET /products/_search
{
  "query": {
    "bool": {
      "must": [
        { "match": { "name": "Elasticsearch" } },
        { "term": { "category": "IT" } }
      ],
      "must_not": [
        { "term": { "stock": false } }
      ],
      "filter": [
        { "range": { "price": { "gte": 20000, "lte": 50000 } } }
      ]
    }
  }
}

검색 조건 조합

  • "must" → name에 "Elasticsearch"가 포함되고, category가 "IT"인 문서.
  • "must_not" → stock이 false인 문서는 제외.
  • "filter" → 가격이 20,000 ~ 50,000 사이인 문서만 포함.

색인, 검색, 업데이트, 삭제 정리

연산 HTTP 메서드 예제
문서 색인 (저장) PUT PUT /products/_doc/1
전체 문서 검색 GET GET /products/_search
조건 검색 GET GET /products/_search { "query": { "match": { "name": "Elasticsearch" } } }
문서 업데이트 POST POST /products/_update/1 { "doc": { "price": 28000 } }
문서 삭제 DELETE DELETE /products/_doc/1

결론

  1. 색인(Indexing)은 데이터를 저장하는 과정이며, JSON 문서 형태로 저장됨.
  2. 문서 검색은 _search API를 사용하며, 다양한 쿼리(Query DSL)를 활용 가능.
  3. Match Query(전문 검색), Term Query(정확한 검색), Bool Query(복합 검색) 등 기본적인 검색 방식 제공.
  4. 업데이트 및 삭제 API를 사용하여 문서를 수정 또는 제거 가능.

 

인덱스(Index)란?

📌 Elasticsearch에서 인덱스(Index)는 데이터를 저장하는 논리적인 공간입니다.
관계형 데이터베이스(RDBMS)의 테이블(Table) 개념과 유사하며, 도큐먼트(Document)의 집합을 의미합니다.

(1) 인덱스의 특징

  • 도큐먼트(Document)를 저장하는 컨테이너 역할.
  • 샤드(Shard) 단위로 데이터를 분할하여 분산 저장.
  • 매핑(Mapping)을 이용해 데이터 유형을 정의.
  • 검색 시 역색인(Inverted Index) 구조를 활용하여 빠르게 조회 가능.

인덱스 생성 및 관리

(1) 인덱스 생성 (PUT /index_name)

PUT /products
{
  "settings": {
    "number_of_shards": 3,
    "number_of_replicas": 1
  }
}
  • 프라이머리 샤드 3개, 복제본 1개로 products 인덱스를 생성.
  • number_of_shards: 데이터 저장을 위한 기본 샤드 개수.
  • number_of_replicas: 복제본 개수 (데이터 안정성 확보).

(2) 인덱스 조회 (GET /_cat/indices?v)

GET _cat/indices?v

🔹 응답 예시

health status index    uuid                   pri rep docs.count size
green  open   products  8vG7YxH0T9S9lF-4jL9H7g  3   1   10         50kb

✅ 현재 클러스터에 존재하는 모든 인덱스 정보를 확인할 수 있음.


(3) 인덱스 삭제 (DELETE /index_name)

DELETE /products

✅ products 인덱스를 삭제.


매핑(Mapping)과 데이터 타입

(1) 매핑(Mapping)이란?

  • Elasticsearch에서 데이터의 스키마를 정의하는 역할.
  • 각 필드의 데이터 타입을 지정 (text, keyword, integer, date, boolean 등).
  • RDBMS의 스키마(Schema)와 유사하지만, 동적으로 확장 가능.

(2) 주요 데이터 타입

데이터 타입 설명
text 전문 검색(Full-text search)에 최적화됨 (형태소 분석 가능)
keyword 정렬 및 필터링에 최적화됨 (형태소 분석 없음)
integer 정수 값 저장
double 실수 값 저장
boolean true 또는 false 값 저장
date 날짜 (YYYY-MM-DD, epoch_millis) 형식 저장
geo_point 위도/경도 좌표 저장 (위치 정보 검색 가능)

(3) 사용자 지정 매핑 예제

PUT /products
{
  "settings": {
    "number_of_shards": 3,
    "number_of_replicas": 1
  },
  "mappings": {
    "properties": {
      "name": { "type": "text" },
      "category": { "type": "keyword" },
      "price": { "type": "integer" },
      "stock": { "type": "boolean" },
      "release_date": { "type": "date", "format": "yyyy-MM-dd" }
    }
  }
}

✅ products 인덱스의 매핑을 정의하여 각 필드의 데이터 유형을 지정.


(4) 매핑 정보 확인 (GET /index_name/_mapping)

GET /products/_mapping

🔹 응답 예시

{
  "products": {
    "mappings": {
      "properties": {
        "name": { "type": "text" },
        "category": { "type": "keyword" },
        "price": { "type": "integer" },
        "stock": { "type": "boolean" },
        "release_date": { "type": "date", "format": "yyyy-MM-dd" }
      }
    }
  }
}

✅ 현재 products 인덱스의 매핑 정보를 조회.


(5) 기존 인덱스에 필드 추가 (PUT /index_name/_mapping)

PUT /products/_mapping
{
  "properties": {
    "rating": { "type": "double" }
  }
}

✅ 기존 products 인덱스에 rating 필드를 추가.


다중 필드(Multi-field)

(1) Multi-field 개념

  • 하나의 필드를 여러 개의 타입으로 저장하여 서로 다른 용도로 사용 가능.
  • 예: text 타입으로 검색, keyword 타입으로 정렬/필터링.

(2) Multi-field 설정 예제

PUT /products
{
  "mappings": {
    "properties": {
      "name": {
        "type": "text",
        "fields": {
          "raw": {
            "type": "keyword"
          }
        }
      }
    }
  }
}

✅ name 필드는 기본적으로 **text 타입(검색용)**이며, "name.raw"는 **keyword 타입(정렬/필터링용)**으로 저장.


(3) Multi-field 검색 예제

GET /products/_search
{
  "query": {
    "match": {
      "name": "Elasticsearch 책"
    }
  }
}

✅ "name" 필드는 text 타입이므로 형태소 분석을 적용하여 검색.

GET /products/_search
{
  "query": {
    "term": {
      "name.raw": "Elasticsearch 책"
    }
  }
}

✅ "name.raw" 필드는 keyword 타입이므로 정확한 단어 일치 검색 가능.


동적 매핑(Dynamic Mapping)

(1) 동적 매핑이란?

  • Elasticsearch는 기본적으로 새로운 필드를 자동으로 감지하여 추가.
  • 사용자가 명시적으로 매핑을 지정하지 않아도 동적으로 필드가 생성됨.

(2) 동적 매핑 기본 예제

PUT /dynamic_test/_doc/1
{
  "product": "Laptop",
  "price": 1200,
  "in_stock": true,
  "release_date": "2023-07-01"
}

✅ 매핑을 지정하지 않았지만, Elasticsearch가 자동으로 필드 유형을 생성.


(3) 동적 매핑 확인

GET /dynamic_test/_mapping

🔹 응답 예시

{
  "dynamic_test": {
    "mappings": {
      "properties": {
        "product": { "type": "text" },
        "price": { "type": "long" },
        "in_stock": { "type": "boolean" },
        "release_date": { "type": "date" }
      }
    }
  }
}

✅ Elasticsearch가 자동으로 데이터 유형을 지정.


(4) 동적 매핑 비활성화

자동 필드 생성을 방지하려면 "dynamic": "strict" 설정을 추가해야 합니다.

PUT /strict_index
{
  "mappings": {
    "dynamic": "strict",
    "properties": {
      "name": { "type": "text" },
      "price": { "type": "integer" }
    }
  }
}

정의되지 않은 필드를 입력하면 오류가 발생하도록 설정.


결론

  1. 인덱스(Index)는 데이터를 저장하는 논리적 컨테이너.
  2. 매핑(Mapping)을 사용하여 각 필드의 데이터 유형을 정의.
  3. Multi-field를 이용해 하나의 필드를 여러 타입으로 저장 가능.
  4. 동적 매핑(Dynamic Mapping)은 자동으로 데이터 유형을 감지하여 필드를 추가.

 

Elasticsearch 설치 방법

📌 Elasticsearch는 로컬, Docker, 클라우드 환경에서 실행 가능하며, 다양한 플랫폼에서 쉽게 설치할 수 있습니다.


(1) 로컬(Local) 설치

🔹 ① Elasticsearch 다운로드 및 설치

Elasticsearch 공식 사이트에서 최신 버전을 다운로드합니다.

📌 Linux/macOS

wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-8.7.0-linux-x86_64.tar.gz
tar -xzf elasticsearch-8.7.0-linux-x86_64.tar.gz
cd elasticsearch-8.7.0

📌 Windows

  1. 공식 다운로드 페이지에서 .zip 파일 다운로드.
  2. 압축을 해제하고 bin/elasticsearch.bat 실행.

🔹 ② Elasticsearch 실행

bin/elasticsearch

✅ 기본적으로 9200번 포트에서 실행됨.

🔹 ③ 실행 확인

curl -X GET "http://localhost:9200/"

✅ 정상적으로 실행되면 Elasticsearch 버전 정보가 출력됨.


(2) Docker를 이용한 설치

🔹 ① Elasticsearch Docker 컨테이너 실행

docker network create elastic
docker run -d --name elasticsearch \
  --net elastic \
  -p 9200:9200 -p 9300:9300 \
  -e "discovery.type=single-node" \
  -e "xpack.security.enabled=false" \
  elasticsearch:8.7.0

Docker 환경에서 간편하게 실행 가능.

🔹 ② 실행 확인

curl -X GET "http://localhost:9200/"

(3) 클라우드에서 실행 (Elastic Cloud)

  • Elasticsearch Service에서 무료 체험 가능.
  • AWS, GCP, Azure 등 클라우드 환경에서 손쉽게 배포 가능.

Elasticsearch.yml 기본 설정

config/elasticsearch.yml 파일을 수정하여 클러스터 및 네트워크 설정을 조정할 수 있습니다.

🔹 기본 설정 항목

# 클러스터 이름 설정
cluster.name: my-cluster

# 노드 이름 설정
node.name: node-1

# 외부 IP에서 접근 허용
network.host: 0.0.0.0

# HTTP 포트 설정 (기본 9200)
http.port: 9200

# 클러스터 초기 마스터 노드 지정
cluster.initial_master_nodes: ["node-1"]

Elasticsearch 노드가 클러스터에 올바르게 참여하려면 동일한 cluster.name을 설정해야 함.


클러스터 실행 및 기본 상태 확인

(1) 클러스터 상태 확인

GET _cluster/health

🔹 응답 예시

{
  "cluster_name": "my-cluster",
  "status": "green",
  "number_of_nodes": 3,
  "number_of_data_nodes": 2,
  "active_primary_shards": 5,
  "active_shards": 10
}

green: 정상 / yellow: 일부 복제본 없음 / red: 심각한 문제.


(2) 노드 정보 조회

 

IP 주소 노드명 역할 상태
192.168.1.10 node-1 마스터 정상
192.168.1.11 node-2 데이터 정상
192.168.1.12 node-3 데이터 정상

현재 클러스터의 모든 노드를 확인 가능.


Elasticsearch 주요 API 사용

Elasticsearch는 JSON 기반의 RESTful API를 제공하며, GET, POST, PUT, DELETE 메서드를 사용하여 데이터 조작이 가능합니다.


(1) 인덱스 생성 (PUT)

PUT /products
{
  "settings": {
    "number_of_shards": 3,
    "number_of_replicas": 1
  }
}

프라이머리 샤드 3개, 복제본 1개 설정된 products 인덱스 생성.


(2) 문서 삽입 (POST)

POST /products/_doc/1
{
  "name": "Elasticsearch 책",
  "category": "IT",
  "price": 30000
}

문서 ID 1을 가진 제품 데이터 삽입.


(3) 문서 조회 (GET)

GET /products/_doc/1

🔹 응답 예시

{
  "_index": "products",
  "_id": "1",
  "_source": {
    "name": "Elasticsearch 책",
    "category": "IT",
    "price": 30000
  }
}

특정 문서를 검색하여 반환.


(4) 문서 업데이트 (POST & PUT)

POST /products/_update/1
{
  "doc": {
    "price": 28000
  }
}

문서 ID 1의 가격을 28,000으로 업데이트.


(5) 문서 삭제 (DELETE)

DELETE /products/_doc/1

문서 ID 1 삭제.


(6) 검색 쿼리 실행

GET /products/_search
{
  "query": {
    "match": {
      "name": "Elasticsearch"
    }
  }
}

"Elasticsearch" 단어가 포함된 모든 문서를 검색.


결론

  1. Elasticsearch는 로컬, Docker, 클라우드 환경에서 설치 및 실행 가능.
  2. elasticsearch.yml을 수정하여 클러스터명, 포트, 노드 설정을 조정.
  3. 클러스터 상태 및 노드 상태를 확인하려면 _cluster/health, _cat/nodes API 활용.
  4. Elasticsearch 주요 API를 사용하여 데이터를 저장, 검색, 업데이트, 삭제 가능.

 

Elasticsearch 기본 개념

개념 설명
노드(Node) Elasticsearch 인스턴스를 실행하는 하나의 서버
클러스터(Cluster) 여러 개의 노드(Node)로 구성된 그룹
인덱스(Index) 여러 개의 도큐먼트(Document)를 저장하는 논리적 데이터 단위
샤드(Shard) 인덱스를 나누어 저장하는 물리적 데이터 단위
도큐먼트(Document) Elasticsearch에서 데이터를 저장하는 기본 단위 (JSON 형식)

Elasticsearch는 여러 노드(Node)로 구성된 클러스터(Cluster)에서 데이터를 샤드(Shard) 단위로 나누어 저장하고 관리함.


주요 개념 상세 설명

(1) 노드(Node)란?

노드는 Elasticsearch의 실행 인스턴스로, 하나 이상의 노드가 모여 클러스터를 형성합니다.

  • 싱글 노드(Single Node): 한 개의 노드로 구성된 Elasticsearch 실행 환경.
  • 멀티 노드(Multi Node): 여러 개의 노드가 하나의 클러스터를 형성하는 환경.

🔹 노드 확인 방법

GET _cat/nodes?v

🔹 노드 정보 예시

ip           name     roles    heap.percent load   node.role
192.168.1.10 node-1   mdi      42          1.2    master, data, ingest
192.168.1.11 node-2   mdi      35          1.5    data, ingest
192.168.1.12 node-3   mdi      50          1.1    data, ingest

각 노드는 특정 역할을 가지며 클러스터 내에서 데이터 저장, 검색, 관리 등의 작업을 수행함.


(2) 클러스터(Cluster)란?

클러스터는 여러 개의 노드(Node)로 구성된 Elasticsearch의 논리적 그룹입니다.
모든 노드는 동일한 cluster.name을 가지며, 클러스터 내에서 데이터를 공유하고 검색을 수행합니다.

🔹 클러스터 상태 확인

GET _cluster/health

🔹 응답 예시

{
  "cluster_name": "my-cluster",
  "status": "green",
  "number_of_nodes": 3,
  "number_of_data_nodes": 2,
  "active_primary_shards": 5,
  "active_shards": 10
}

클러스터는 Elasticsearch의 핵심 구성 요소로, 노드 간 데이터 복제 및 분산 저장을 수행함.


(3) 인덱스(Index)란?

인덱스는 데이터를 저장하는 논리적 공간으로, 관계형 데이터베이스의 테이블(Table) 개념과 유사합니다.
각 인덱스는 여러 개의 샤드(Shard)로 분할되며, 샤드 단위로 데이터를 저장합니다.

🔹 인덱스 생성 예제

PUT /products
{
  "settings": {
    "number_of_shards": 3,
    "number_of_replicas": 1
  }
}

인덱스는 여러 개의 도큐먼트(Document)로 구성되며, 검색과 색인의 기본 단위가 됨.


(4) 샤드(Shard)란?

샤드는 인덱스를 나누어 저장하는 물리적 데이터 단위입니다.
대량의 데이터를 저장하고 검색할 때 성능을 높이기 위해 샤드 단위로 데이터를 분산 저장합니다.

  • 프라이머리 샤드(Primary Shard): 원본 데이터를 저장하는 주요 샤드.
  • 복제본 샤드(Replica Shard): Primary Shard의 복제본으로, 데이터 유실 방지 및 검색 성능 향상 역할.

🔹 샤드 정보 확인

GET _cat/shards?v

샤드는 인덱스 성능과 확장성을 결정하는 중요한 요소이며, 클러스터 내 여러 노드에 분산 저장됨.


(5) 도큐먼트(Document)란?

도큐먼트는 Elasticsearch에서 데이터를 저장하는 가장 작은 단위입니다.
모든 도큐먼트는 JSON 형식으로 저장되며, 고유한 _id 값을 가집니다.

🔹 도큐먼트 색인 예제

PUT /products/_doc/1
{
  "name": "Elasticsearch 책",
  "category": "IT",
  "price": 30000
}

Elasticsearch는 관계형 DB처럼 행(Row) 개념이 없으며, 데이터를 JSON 문서(Document) 형태로 저장함.


프라이머리 샤드(Primary Shard)와 복제본(Replica Shard) 개념

샤드 유형 설명
Primary Shard 원본 데이터를 저장하는 주요 샤드
Replica Shard Primary Shard의 복제본으로, 데이터 유실 방지 및 검색 부하 분산

🔹 Primary Shard와 Replica Shard 예시

  • 인덱스를 프라이머리 샤드 3개, 복제본 1개로 설정하면 총 6개의 샤드(3 Primary + 3 Replica)가 생성됨.

복제본(Replica Shard)은 반드시 Primary Shard와 다른 노드에 저장되어야 함.


노드의 역할 (Node Roles)

Elasticsearch 노드는 역할(Role)에 따라 다르게 동작합니다.

노드 유형 설명
마스터 노드 (Master Node) 클러스터 상태 관리, 노드 추가/삭제, 샤드 할당
데이터 노드 (Data Node) 데이터를 저장하고 검색 및 색인 수행
코디네이팅 노드 (Coordinating Node) 클라이언트 요청을 받아 데이터 노드에 분산

(1) 마스터 노드 (Master Node)

  • 클러스터의 상태 관리 (샤드 할당, 노드 추가/삭제).
  • 클러스터 설정 변경.

🔹 마스터 전용 노드 설정

node.master: true
node.data: false

마스터 노드는 클러스터 안정성을 위해 최소 3개 이상의 홀수 개수로 운영하는 것이 좋음.


(2) 데이터 노드 (Data Node)

  • 실제 데이터를 저장하고 색인/검색을 수행.
  • CPU, 메모리, 디스크 I/O 리소스를 많이 사용.

🔹 데이터 노드 전용 설정

node.master: false
node.data: true

대량 데이터 저장이 필요한 경우 데이터 노드의 리소스를 충분히 할당하는 것이 중요함.


(3) 코디네이팅 노드 (Coordinating Node)

  • 클라이언트 요청을 받아 적절한 데이터 노드로 분배.
  • 직접 데이터를 저장하지 않고 검색 요청을 최적화하는 역할.

🔹 코디네이팅 전용 노드 설정

node.master: false
node.data: false

대량의 검색 요청이 있는 경우 코디네이팅 노드를 추가하여 부하를 분산 가능.


결론

  • Elasticsearch는 여러 개의 노드(Node)로 구성된 클러스터(Cluster)에서 데이터를 샤드(Shard) 단위로 분산 저장함.
  • 프라이머리 샤드(Primary Shard)는 원본 데이터를 저장하고, 복제본(Replica Shard)은 데이터 유실 방지 역할을 수행.
  • 마스터 노드는 클러스터를 관리하고, 데이터 노드는 저장 및 검색, 코디네이팅 노드는 요청을 최적화하는 역할을 함.

 

Elasticsearch란 무엇인가?

📌 Elasticsearch는 오픈소스 분산 검색 및 분석 엔진으로, JSON 기반의 RESTful API를 통해 데이터를 저장, 검색, 분석할 수 있는 시스템입니다.
기본적으로 Apache Lucene을 기반으로 구축되었으며, 빠른 검색 속도와 대량 데이터 처리가 가능하여 다양한 분야에서 활용됩니다.

Elasticsearch의 주요 기능

  • 전문 검색(Full-Text Search): 텍스트 기반의 고급 검색 가능 (형태소 분석, 동의어 처리 등).
  • 실시간 데이터 분석: 로그 및 스트리밍 데이터를 분석.
  • 분산형 아키텍처: 여러 개의 노드가 클러스터를 이루어 데이터를 저장하고 처리.
  • 확장성(Scalability): 샤드(Shard) 단위로 데이터를 분산 저장하여 대량 데이터 처리 가능.
  • JSON 기반 REST API 제공: 다양한 애플리케이션과 쉽게 연동 가능.

ELK Stack 개요

ELK Stack은 Elasticsearch, Logstash, Kibana로 구성된 데이터 수집, 저장, 분석 및 시각화 솔루션입니다.
최근에는 Beats가 추가되어 Elastic Stack이라고도 불립니다.

구성 요소 설명
Elasticsearch 데이터를 저장, 검색, 분석하는 핵심 엔진
Logstash 다양한 소스에서 데이터를 수집하고 변환 후 Elasticsearch로 전송
Kibana Elasticsearch 데이터를 시각화하고 대시보드를 제공
Beats 경량 데이터 수집기(Filebeat, Metricbeat 등)로, 다양한 데이터 원본에서 데이터를 수집하여 Logstash 또는 Elasticsearch로 전송

ELK Stack은 실시간 로그 분석, 모니터링, 보안 분석 등의 목적으로 널리 사용됨.


Elasticsearch의 특징 및 활용 사례

(1) Elasticsearch의 주요 특징

  1. 고속 검색 및 분석
    • 데이터가 색인(Indexing)되어 있어 빠른 검색 가능.
    • 전문 검색(Full-Text Search) 및 유사도 검색 지원.
  2. JSON 기반 REST API 제공
    • HTTP 요청을 통해 쉽게 데이터를 저장하고 조회할 수 있음.
    • 다양한 프로그래밍 언어에서 활용 가능 (Python, Java, JavaScript 등).
  3. 분산 저장 및 확장성
    • 여러 개의 노드로 구성된 클러스터를 통해 대량 데이터를 저장 및 처리.
    • 데이터가 샤드(Shard) 단위로 분산 저장되어 부하 분산 가능.
  4. 다양한 데이터 유형 지원
    • 구조화된 데이터(SQL, NoSQL)뿐만 아니라 비정형 데이터(텍스트, 로그, JSON)도 지원.

(2) Elasticsearch의 활용 사례

분야  사례
검색 엔진 전자상거래(쇼핑몰 상품 검색), 포털 사이트(문서 검색)
로그 및 모니터링 서버 및 애플리케이션 로그 분석 (Elastic Stack 활용)
보안 및 SIEM 보안 이벤트 탐지, 침입 감지 시스템 (IDS)
데이터 분석 및 BI 실시간 데이터 분석, 대시보드 제공 (Kibana 연동)
추천 시스템 사용자 행동 기반 추천 서비스 (예: 넷플릭스, 유튜브)

Elasticsearch는 검색 및 데이터 분석이 필요한 다양한 산업에서 활용됨.


결론

  • Elasticsearch는 빠른 검색, 대량 데이터 처리, 확장성이 뛰어난 검색 및 분석 엔진.
  • ELK Stack(Logstash, Kibana)과 함께 사용하면 실시간 데이터 분석 및 시각화가 가능.
  • 로그 분석, 검색 시스템, 보안 분석, 추천 시스템 등 다양한 산업에서 활용됨.

 

Elasticsearch 학습 로드맵 🚀

Elasticsearch를 효과적으로 학습하려면 기본 개념 → 색인 및 검색 → 클러스터 관리 → 최적화 및 확장 순서로 학습하는 것이 좋습니다.
아래는 초급 → 중급 → 고급 단계별 학습 로드맵입니다.

https://esbook.kimjmin.net/


🔰 1. 초급: Elasticsearch 기초 개념

(1) Elasticsearch 개요

  • Elasticsearch란 무엇인가? (검색 엔진, 분석 엔진)
  • ELK Stack (Elasticsearch, Logstash, Kibana) 개요
  • Elasticsearch의 특징 및 활용 사례

(2) 기본 아키텍처 이해

  • 노드(Node), 클러스터(Cluster), 인덱스(Index), 샤드(Shard), 도큐먼트(Document) 개념
  • 프라이머리 샤드(Primary Shard)와 복제본(Replica Shard) 개념
  • 마스터 노드(Master Node), 데이터 노드(Data Node), 코디네이팅 노드(Coordinating Node) 역할

(3) 설치 및 기본 환경 설정

  • Elasticsearch 설치 (로컬, Docker, 클라우드)
  • elasticsearch.yml 기본 설정 (포트, 클러스터 이름 등)
  • 클러스터 실행 및 기본 상태 확인 (_cluster/health)
  • Elasticsearch 주요 API 사용 (GET, POST, PUT, DELETE)

🟢 2. 중급: 데이터 색인 및 검색

(4) 인덱스(Index)와 매핑(Mapping)

  • 인덱스 생성 및 관리 (PUT /index_name)
  • 매핑(Mapping): 데이터 타입 (text, keyword, date, integer, boolean 등)
  • 다중 필드(Multi-field), 동적 매핑(Dynamic Mapping)

(5) 색인(Indexing)과 검색(Search) 기본

  • 문서 색인 (PUT /index/_doc/1)
  • 문서 검색 (GET /index/_search)
  • 문서 업데이트 및 삭제 (POST /_update, DELETE /_doc/1)
  • Match, Term, Bool Query 기본 사용법

(6) 쿼리 DSL (Query DSL) 활용

  • Match Query vs Term Query 차이점
  • Bool Query (must, should, must_not, filter)
  • Range Query (숫자, 날짜 검색)
  • Multi-match Query (여러 필드 검색)
  • Aggregation(집계) 기본

🔵 3. 고급: 데이터 분석 및 최적화

(7) 고급 검색 및 분석

  • Full-Text Search (전문 검색) 개념
  • 형태소 분석기(Tokenizer, Analyzer) 사용법
  • Nori Analyzer를 이용한 한국어 형태소 분석 적용
  • 페이징(Pagination)과 Scroll API 활용 (대량 데이터 검색)
  • search_after, point_in_time을 이용한 성능 최적화

(8) Aggregation (집계) 심화 학습

  • Bucket Aggregation (Terms, Histogram, Date Histogram)
  • Metric Aggregation (Sum, Avg, Min, Max, Cardinality)
  • 하위 집계 (Sub Aggregations)
  • Pipeline Aggregation (Moving Avg, Bucket Script)

(9) Ingest Pipeline & Reindex API

  • Ingest Pipeline을 활용한 데이터 변환 (set, rename, grok 활용)
  • Reindex API를 사용한 데이터 마이그레이션

🟣 4. 클러스터 운영 및 성능 최적화

(10) 클러스터 및 샤드 최적화

  • 클러스터 상태 확인 (_cat/nodes, _cat/shards, _cluster/health)
  • 샤드 개수 설정 (number_of_shards, number_of_replicas)
  • 노드 장애 발생 시 복구 (_cluster/allocation/explain)
  • Split Brain 문제 방지 (minimum_master_nodes 설정)

(11) 데이터 모델링 및 성능 최적화

  • text vs keyword 필드 선택 기준
  • Nested Field vs Join Field
  • Refresh Interval 조정 (index.refresh_interval)
  • Force Merge, Segment 최적화 (_forcemerge)

(12) Elasticsearch Scaling (확장 전략)

  • Hot-Warm-Cold 아키텍처
  • Cross Cluster Search (CCS), Cross Cluster Replication (CCR)
  • Snapshot & Restore (백업 및 복구)

🟠 5. 실전 활용 (Elastic Stack & 보안)

(13) Kibana 연동 및 데이터 시각화

  • Kibana 설치 및 기본 사용법
  • Discover, Dashboard, Visualization 활용
  • Dev Tools (Elasticsearch Query 직접 실행)

(14) 보안 및 인증 설정

  • Role-based Access Control (RBAC)
  • TLS/SSL 설정 (X-Pack Security)
  • API Key 및 User Authentication

(15) Logstash 및 Beats 활용 (ELK Stack 구성)

  • Logstash를 이용한 데이터 수집 및 변환
  • Beats (Filebeat, Metricbeat, Heartbeat) 활용
  • Kafka와 Elasticsearch 연동

🔴 6. 전문가 과정 (운영 및 커스텀 개발)

(16) Elasticsearch 운영 및 모니터링

  • Monitoring (_cluster/stats, _nodes/stats)
  • Elasticsearch Heap Memory 관리
  • index.lifecycle을 이용한 Index LifeCycle Management (ILM)
  • Elastic APM (Application Performance Monitoring) 활용

(17) 커스텀 플러그인 개발

  • Elasticsearch Plugin 개발 환경 설정
  • 커스텀 Ingest Processor 개발
  • Java 클라이언트 (High-Level REST Client) 사용법

🚀 7. Elasticsearch 학습을 위한 추천 자료

공식 문서 및 튜토리얼

실습 및 무료 강의

도서 추천

  • Elasticsearch: The Definitive Guide (한글 번역본: Elasticsearch 완벽 가이드)
  • Elasticsearch in Action
  • Kibana Essentials

🎯 Elasticsearch 학습 순서 요약

단계 학습 내용
1. 초급 Elasticsearch 개념, 설치, 기본 API 사용
2. 중급 인덱스, 매핑, 색인, 쿼리 DSL, 검색 최적화
3. 고급 Aggregation, Ingest Pipeline, 형태소 분석
4. 운영 클러스터 최적화, 샤드 관리, 확장 전략
5. 실전 활용 Kibana, Logstash, Beats 연동
6. 전문가 과정 운영 모니터링, 보안, 커스텀 개발

 

Elasticsearch 클러스터란?

📌 Elasticsearch는 여러 개의 노드(Node)가 하나의 클러스터(Cluster)로 묶여 동작하는 분산 시스템입니다.
각 노드는 데이터를 저장하고 검색하며, 클러스터 내 다른 노드들과 통신하여 데이터를 공유합니다.


클러스터를 구성하는 요소

Elasticsearch 클러스터는 여러 개의 노드로 구성되며, 각 노드는 역할에 따라 구분됩니다.

노드 유형 설명

마스터 노드 (Master Node) 클러스터 상태 관리 (샤드 할당, 노드 추가/삭제, 설정 변경 등)
데이터 노드 (Data Node) 실제 데이터를 저장하고 색인/검색 수행
코디네이팅 노드 (Coordinating Node) 검색 요청을 받아 데이터 노드에 분산 후 결과를 취합
머신러닝 노드 (ML Node) 이상 탐지 및 머신러닝 분석 수행
트랜스포트 노드 (Ingest Node) 데이터 전처리(ETL) 및 파이프라인 처리 수행

클러스터에서 노드 간 통신

(1) Elasticsearch 노드는 2개의 포트를 사용

  • HTTP 포트 (9200~9299) → 클라이언트와의 통신 (REST API 요청 처리)
  • TCP 포트 (9300~9399) → 클러스터 내부 노드 간 데이터 교환

기본적으로 1개의 물리 서버에 1개의 노드를 실행하는 것이 권장됨.


클러스터 구성 방법

(1) 여러 서버에서 하나의 클러스터 실행

서버 3대를 사용하여 3개의 노드를 실행하고, 하나의 클러스터로 구성할 수 있습니다.

# Node-1 설정 (서버 1)
cluster.name: my-cluster
node.name: node-1
network.host: 192.168.1.10
discovery.seed_hosts: ["192.168.1.11", "192.168.1.12"]
cluster.initial_master_nodes: ["node-1", "node-2", "node-3"]
# Node-2 설정 (서버 2)
cluster.name: my-cluster
node.name: node-2
network.host: 192.168.1.11
discovery.seed_hosts: ["192.168.1.10", "192.168.1.12"]
cluster.initial_master_nodes: ["node-1", "node-2", "node-3"]
# Node-3 설정 (서버 3)
cluster.name: my-cluster
node.name: node-3
network.host: 192.168.1.12
discovery.seed_hosts: ["192.168.1.10", "192.168.1.11"]
cluster.initial_master_nodes: ["node-1", "node-2", "node-3"]

모든 노드의 cluster.name이 동일해야 하나의 클러스터로 동작.


(2) 하나의 서버에서 여러 개의 노드 실행

한 개의 물리 서버에서 여러 개의 Elasticsearch 노드를 실행할 수도 있습니다.
이 경우 각 노드는 다른 포트를 사용해야 하며, 클러스터명을 동일하게 설정해야 합니다.

🔹 Node-1 (es-cluster-1)

cluster.name: es-cluster-1
node.name: node-1
http.port: 9200
transport.port: 9300

🔹 Node-2 (es-cluster-1)

cluster.name: es-cluster-1
node.name: node-2
http.port: 9201
transport.port: 9301

🔹 Node-3 (es-cluster-2 - 다른 클러스터)

cluster.name: es-cluster-2
node.name: node-3
http.port: 9202
transport.port: 9302

Node-1과 Node-2는 같은 클러스터에서 동작하며, Node-3은 별도의 클러스터로 동작.


클러스터 실행 및 확인

(1) Elasticsearch 노드 실행

노드를 실행할 때 명령어를 사용하여 설정을 직접 입력할 수도 있습니다.

bin/elasticsearch -Ecluster.name=es-cluster-1 -Enode.name=node-1

(2) 실행된 노드 확인

노드 실행 후, 터미널에 출력되는 메시지를 확인할 수 있습니다.

[INFO ][o.e.c.s.MasterService    ] [node-1] elected-as-master ([1] nodes joined)

✅ elected-as-master 메시지를 통해 마스터 노드가 정상적으로 선출되었음을 확인 가능.


클러스터 노드 탐색 (Discovery)

(1) Discovery란?

새로운 노드가 추가될 때 기존 노드를 검색하여 같은 클러스터로 묶이는 과정을 Discovery라고 합니다.

(2) Discovery 과정

  1. discovery.seed_hosts에 설정된 노드 목록에서 검색을 시작.
  2. 해당 노드가 존재하면 cluster.name이 동일한지 확인.
  3. 동일하면 클러스터에 참여, 다르면 독립된 클러스터로 유지.
discovery.seed_hosts: ["192.168.1.10", "192.168.1.11", "192.168.1.12"]

최초 실행할 마스터 후보 노드 3~5개만 설정하면 자동으로 클러스터 탐색이 수행됨.


클러스터 상태 확인

(1) 현재 실행 중인 노드 조회

GET _cat/nodes?v

IP 주소 노드명 역할 상태

192.168.1.10 node-1 마스터 정상
192.168.1.11 node-2 데이터 정상
192.168.1.12 node-3 데이터 정상

(2) 현재 클러스터 상태 확인

GET _cluster/health?pretty

응답 예시

{
  "cluster_name": "my-cluster",
  "status": "green",
  "number_of_nodes": 3,
  "number_of_data_nodes": 2,
  "active_primary_shards": 5,
  "active_shards": 10
}

"status": "green"이면 정상 운영 중, "yellow" 또는 "red"는 문제 발생 가능.


Elasticsearch 클러스터 구성 시 고려 사항

(1) 마스터 노드 최소 3개 유지

  • Split Brain 방지를 위해 마스터 후보 노드는 항상 홀수 개(3, 5, 7개 등)로 설정.

(2) 데이터 노드와 마스터 노드 분리

  • 대규모 클러스터에서는 마스터 노드와 데이터 노드를 분리하여 성능 최적화.

(3) Discovery 설정 필수

  • discovery.seed_hosts를 설정하지 않으면 새로운 노드가 기존 클러스터에 합류하지 못할 수 있음.

결론

  • Elasticsearch는 여러 개의 노드로 이루어진 분산 클러스터 구조.
  • 클러스터를 구성하려면 모든 노드의 cluster.name을 동일하게 설정해야 함.
  • 마스터 노드와 데이터 노드를 분리하여 성능과 안정성을 향상할 수 있음.
  • Discovery 설정을 통해 노드가 자동으로 클러스터에 합류할 수 있도록 설정 필요.

 

Elasticsearch 클러스터 개요

📌 Elasticsearch는 분산형 검색 및 데이터 저장 시스템으로, 여러 개의 **노드(Node)**가 모여 **클러스터(Cluster)**를 형성합니다.
각 노드는 역할(Role)에 따라 **마스터 노드(Master Node)**와 **데이터 노드(Data Node)**로 구분됩니다.


마스터 노드 (Master Node)

(1) 마스터 노드의 역할

  • 클러스터의 전반적인 상태(Cluster State) 관리
  • 인덱스 및 샤드(Shard) 할당 관리
  • 노드 추가 및 삭제 관리
  • 클러스터 설정 변경

마스터 노드는 검색 및 데이터 저장이 아닌 클러스터 관리 역할만 수행합니다.


(2) 마스터 노드 설정

Elasticsearch에서는 기본적으로 모든 노드가 마스터 후보(Master Eligible Node)로 동작할 수 있습니다.
그러나 대규모 클러스터에서는 마스터 전용 노드를 별도로 운영하는 것이 성능상 유리합니다.

🔹 마스터 노드만 수행하도록 설정

node.master: true
node.data: false
  • 마스터 노드로만 동작하고 데이터 저장 기능은 수행하지 않음.

🔹 마스터 후보 노드에서 제외

node.master: false
  • 해당 노드는 마스터 후보에서 제외되며, 데이터 노드 또는 다른 역할을 수행.

데이터 노드 (Data Node)

(1) 데이터 노드의 역할

  • 실제 데이터를 저장하고 관리
  • 색인(Indexing) 및 검색(Query) 실행
  • 프라이머리 샤드 및 복제본 저장

데이터 노드는 클러스터에서 가장 많은 리소스를 소비하는 노드이며, CPU, 메모리, 디스크 I/O 성능이 중요합니다.


(2) 데이터 노드 설정

마스터 역할을 하지 않고 데이터 노드로만 동작하도록 설정할 수 있습니다.

🔹 데이터 노드 전용 설정

node.master: false
node.data: true
  • 해당 노드는 데이터 저장만 수행하며, 클러스터 관리 역할을 하지 않음.

마스터 노드와 데이터 노드 분리 예제

(1) 4개의 노드 구성 예시

노드 이름 역할

Node-1 마스터 노드 (Master Node)
Node-2 데이터 노드 (Data Node)
Node-3 데이터 노드 (Data Node)
Node-4 데이터 노드 (Data Node)

(2) 설정 파일 예제

🔹 마스터 노드 설정 (Node-1)

node.name: "node-1"
node.master: true
node.data: false

🔹 데이터 노드 설정 (Node-2, Node-3, Node-4)

node.name: "node-2"
node.master: false
node.data: true

이렇게 설정하면 마스터 노드는 클러스터 관리를 담당하고, 데이터 노드는 데이터 저장과 검색을 수행.


Split Brain 문제와 해결 방법

(1) Split Brain이란?

  • 네트워크 장애(Network Partition)로 인해 마스터 후보 노드들이 서로 다른 클러스터로 분리되는 현상.
  • 두 개 이상의 클러스터가 독립적으로 작동하면 데이터 정합성 문제 발생 가능.

(2) Split Brain 방지 방법

  • 마스터 후보 노드를 3개 이상, 홀수 개로 설정.
  • 마스터 후보 노드가 최소 과반수 이상일 때만 클러스터 유지.

🔹 예제: 마스터 후보 노드 설정 (최소 3개)

cluster.initial_master_nodes: ["node-1", "node-2", "node-3"]

이렇게 하면 마스터 노드가 2개 이상 존재할 때만 클러스터가 정상 동작.


마스터 노드와 데이터 노드의 장단점

유형 장점 단점

마스터 전용 노드 클러스터 관리 성능 향상 추가적인 노드 운영 필요
데이터 전용 노드 색인 및 검색 성능 최적화 클러스터 관리 부담 증가
마스터 + 데이터 혼합 노드 초기 소규모 클러스터 운영 가능 클러스터 확장 시 성능 저하 가능

결론

  • 마스터 노드는 클러스터 관리만 담당하고, 데이터 저장을 하지 않음.
  • 데이터 노드는 색인과 검색을 수행하며, 대량의 데이터를 저장.
  • Split Brain 방지를 위해 마스터 후보 노드는 3개 이상(홀수 개)로 설정.
  • 대규모 클러스터에서는 마스터 노드와 데이터 노드를 분리하여 운영하는 것이 성능적으로 유리.

 

'Elastic Search > Elastic 시스템 구조' 카테고리의 다른 글

[Elasticsearch] 클러스터 구성  (0) 2025.02.01
[Elasticsearch] Index & Shards  (0) 2025.02.01

인덱스와 샤드 (Index & Shards)

1. 인덱스(Index)란?

  • Elasticsearch에서 데이터 저장 단위로, 여러 개의 문서(Document)를 포함.
  • 관계형 데이터베이스(RDBMS)의 테이블(Table) 개념과 유사.
  • 인덱스는 기본적으로 샤드(Shard)라는 단위로 분할되어 저장됨.

2. 샤드(Shard)란?

  • 인덱스의 데이터를 저장하는 기본 단위.
  • Elasticsearch는 대량의 데이터를 효과적으로 저장하고 검색하기 위해 샤드를 여러 개로 나누어 분산 저장함.
  • 샤드는 **프라이머리 샤드(Primary Shard)와 복제본(Replica Shard)**으로 구분됨.

프라이머리 샤드(Primary Shard)와 복제본(Replica Shard)

샤드 유형 설명

프라이머리 샤드 (Primary Shard) 데이터가 처음 저장되는 기본 샤드.
복제본 샤드 (Replica Shard) 프라이머리 샤드의 복제본으로, 장애 발생 시 데이터 손실 방지.

샤드 개수 설정

  • Elasticsearch 7.0 이상에서는 기본적으로 프라이머리 샤드 1개, 복제본 1개로 설정됨.
  • Elasticsearch 6.x 이하에서는 기본적으로 프라이머리 샤드 5개로 설정됨.

샤드와 노드 분산 구조

샤드는 클러스터 내 여러 개의 노드(Node)에 분산 저장됩니다.

샤드 분배 예시

  • 5개의 프라이머리 샤드(Primary Shards)
  • 각각 1개의 복제본(Replica Shards)
  • 총 10개의 샤드(Primary + Replica)
  • 4개의 노드에 분산 저장됨

노드(Node) 저장된 샤드

Node-1 프라이머리 샤드 #1, 복제본 #3
Node-2 프라이머리 샤드 #2, 복제본 #4
Node-3 프라이머리 샤드 #3, 복제본 #5
Node-4 프라이머리 샤드 #4, 복제본 #1

샤드와 복제본은 반드시 서로 다른 노드에 저장됨 (데이터 손실 방지).


노드 장애 발생 시 샤드 복구

노드(Node) 유실 시 복제본 자동 복구

  • 예를 들어, Node-3이 장애로 다운되면 프라이머리 샤드 #3, 복제본 #5가 손실됨.
  • Elasticsearch는 남아 있는 복제본 중 하나를 프라이머리 샤드로 승격(Promotion)하고, 새로운 복제본을 생성하여 데이터 일관성을 유지함.

상태 설명

Node 장애 발생 Node-3이 사라지면서 0번, 4번 샤드 유실
복제본 승격 Node-1 또는 Node-2의 0번, 4번 복제본이 프라이머리 샤드로 승격
새로운 복제본 생성 남은 노드에서 새로운 복제본 샤드 자동 생성

Elasticsearch는 클러스터 장애 발생 시 자동으로 데이터를 복구하여 가용성을 유지.


샤드 개수 설정 방법

(1) 인덱스 생성 시 샤드 개수 지정

프라이머리 샤드 수는 인덱스를 처음 생성할 때만 설정 가능하며, 생성 후 변경할 수 없습니다.
복제본 샤드는 나중에 변경할 수 있습니다.

curl -XPUT "http://localhost:9200/books" -H 'Content-Type: application/json' -d'
{
  "settings": {
    "number_of_shards": 5,
    "number_of_replicas": 1
  }
}'
  • 프라이머리 샤드 5개, 복제본 1개 설정총 10개의 샤드 생성 (5 Primary + 5 Replica).

(2) 복제본(Replica) 개수 변경

복제본 개수는 동적으로 변경할 수 있습니다.

curl -XPUT "http://localhost:9200/books/_settings" -H 'Content-Type: application/json' -d'
{
  "number_of_replicas": 0
}'
  • 복제본 개수를 0으로 설정하여 샤드 수를 줄임.

샤드 개수 설정 시 고려할 요소

(1) 프라이머리 샤드 개수

  • 너무 적게 설정하면: 검색 속도가 느려질 수 있음.
  • 너무 많게 설정하면: 관리 오버헤드 증가 및 성능 저하 가능.
  • 일반적으로 샤드 하나의 크기는 10~50GB로 유지하는 것이 성능적으로 유리.

(2) 복제본 개수

  • 복제본 개수를 늘리면 검색 성능 향상 및 장애 복구 가능.
  • 하지만 쓰기 성능은 감소(데이터를 여러 번 복제해야 하므로).

샤드 관련 주요 API 정리

API 설명

GET /_cat/shards?v 클러스터 내 모든 샤드 정보 조회
GET /_cat/indices?v 클러스터 내 모든 인덱스 조회
PUT /{index}/_settings 기존 인덱스의 복제본 개수 변경
DELETE /{index} 인덱스 삭제

샤드 개수 설정의 장단점

항목 장점 단점

프라이머리 샤드 많음 병렬 검색 속도 증가 노드 리소스 사용 증가
프라이머리 샤드 적음 인덱스 관리가 쉬움 검색 성능 저하 가능
복제본 많음 검색 성능 향상, 장애 복구 가능 저장 공간 및 리소스 증가
복제본 적음 저장 공간 절약 장애 발생 시 데이터 손실 위험

결론

  • Elasticsearch는 데이터를 저장할 때 샤드(Shard)라는 단위로 분산 저장함.
  • 샤드는 **프라이머리 샤드(Primary Shard)와 복제본 샤드(Replica Shard)**로 구성됨.
  • 복제본 샤드는 노드 장애 시 자동 복구를 수행하여 데이터 무결성을 유지.
  • 프라이머리 샤드는 생성 후 변경할 수 없으므로 처음 설정할 때 신중해야 함.
  • 복제본 샤드는 검색 성능과 장애 복구를 위해 중요한 요소이며, 운영 중에도 변경 가능.

 

형태소 분석이란?

📌 형태소 분석(Morphological Analysis)은 텍스트를 의미 단위(형태소)로 분리하고 품사를 태깅하는 과정입니다.
Elasticsearch는 형태소 분석을 통해 검색 정확도를 향상시키며, 특히 한국어, 일본어, 중국어처럼 공백이 명확하지 않은 언어에서 필수적으로 사용됩니다.


Elasticsearch에서의 형태소 분석 과정

Elasticsearch에서 형태소 분석은 **토크나이저(Tokenizer)와 필터(Filter)**를 통해 이루어집니다.

(1) 형태소 분석의 기본 흐름

입력 문장 → 토크나이저(Tokenizer) → 토큰 필터(Token Filter) → 색인(Indexing) 또는 검색(Query)

(2) 기본 분석기 (Built-in Analyzers)

Elasticsearch는 다양한 기본 분석기를 제공하지만, 형태소 분석을 수행하려면 **전용 분석기(Analyzer)**를 사용해야 합니다.

분석기 설명

Standard Analyzer 기본 분석기 (공백 및 일부 문장부호 기준으로 단어 분리)
Simple Analyzer 모든 문자를 소문자로 변환하고 공백을 기준으로 단어 분리
Whitespace Analyzer 공백을 기준으로 단어를 분리하지만 추가적인 변형 없음
Keyword Analyzer 전체 문자열을 하나의 단위로 저장 (형태소 분석 없음)
Nori Analyzer 한국어 형태소 분석기
Kuromoji Analyzer 일본어 형태소 분석기
IK Analyzer 중국어 형태소 분석기

Elasticsearch에서 한국어 형태소 분석

Elasticsearch에서 한국어 형태소 분석을 수행하려면 **Nori 분석기(Nori Analyzer)**를 사용합니다.

(1) Nori 분석기란?

  • Elasticsearch 6.4 버전부터 기본 포함된 한국어 형태소 분석기.
  • Lucene 기반으로 개발되었으며, 한국어 문법에 맞는 분석 기능 제공.
  • 형태소 분석과 불용어(Stopwords) 필터링 지원.

Nori 분석기 사용 방법

(1) 기본 형태소 분석 테스트

Elasticsearch의 _analyze API를 사용하여 Nori 분석기를 테스트할 수 있습니다.

예제 1: 형태소 분석 실행

GET _analyze
{
  "analyzer": "nori",
  "text": "나는 엘라스틱서치를 공부하고 있다."
}

결과

{
  "tokens": [
    { "token": "나", "type": "Noun" },
    { "token": "는", "type": "Josa" },
    { "token": "엘라스틱서치", "type": "Noun" },
    { "token": "를", "type": "Josa" },
    { "token": "공부", "type": "Noun" },
    { "token": "하", "type": "Verb" },
    { "token": "고", "type": "Eomi" },
    { "token": "있", "type": "Adjective" },
    { "token": "다", "type": "Eomi" }
  ]
}

Nori 분석기가 문장을 형태소 단위로 분리하고, 품사 태깅을 적용한 것을 확인할 수 있습니다.


(2) Nori 토크나이저(Nori Tokenizer) 설정

Nori 분석기는 다양한 토큰화(Tokenization) 방식을 지원합니다.

PUT /nori_test
{
  "settings": {
    "analysis": {
      "analyzer": {
        "my_nori_analyzer": {
          "type": "custom",
          "tokenizer": "nori_tokenizer"
        }
      }
    }
  }
}
  • nori_tokenizer: 한국어 문장을 형태소 단위로 분석하여 색인.

(3) 사용자 사전(Custom Dictionary) 적용

한국어 형태소 분석에서 중요한 요소 중 하나는 사용자 정의 사전(Custom Dictionary) 입니다.
Nori 분석기는 사전을 추가하여 특정 단어를 올바르게 분석할 수 있습니다.

예제 2: 사용자 사전 적용

PUT /nori_test
{
  "settings": {
    "analysis": {
      "tokenizer": {
        "nori_user_dict": {
          "type": "nori_tokenizer",
          "decompound_mode": "mixed",
          "user_dictionary": "userdict_ko.txt"
        }
      },
      "analyzer": {
        "custom_nori_analyzer": {
          "type": "custom",
          "tokenizer": "nori_user_dict"
        }
      }
    }
  }
}
  • user_dictionary 옵션: 사용자 정의 단어를 사전으로 등록.
  • decompound_mode:
    • none: 복합어를 분리하지 않음.
    • mixed: 복합어를 분리하면서 원래 단어도 포함.
    • discard: 복합어를 완전히 분리.

형태소 분석을 활용한 검색 최적화

Elasticsearch에서 형태소 분석기를 활용하면 검색 정확도를 크게 향상시킬 수 있습니다.

(1) 정확한 검색(Query DSL 적용)

GET /nori_test/_search
{
  "query": {
    "match": {
      "content": "엘라스틱서치를 공부"
    }
  }
}

✅ 공부하고 있다라는 문장이 있어도 형태소 분석을 통해 "공부"라는 단어만으로 검색 가능.


(2) 동의어(Synonym) 검색 적용

PUT /nori_test
{
  "settings": {
    "analysis": {
      "filter": {
        "synonym_filter": {
          "type": "synonym",
          "synonyms": [
            "엘라스틱서치, ES",
            "검색엔진, 검색 시스템"
          ]
        }
      },
      "analyzer": {
        "synonym_analyzer": {
          "type": "custom",
          "tokenizer": "nori_tokenizer",
          "filter": ["synonym_filter"]
        }
      }
    }
  }
}

✅ "엘라스틱서치"를 검색해도 "ES"가 포함된 문서도 함께 검색됨.


Elasticsearch 형태소 분석의 장점과 단점

장점

  1. 한국어 문장을 형태소 단위로 분리 → 검색 정확도 향상.
  2. 사용자 사전 적용 가능 → 특정 도메인(의료, 법률 등)에서 최적화 가능.
  3. 동의어 필터, 복합어 분석 지원 → 검색 확장성 증가.

단점

  1. 형태소 분석 결과가 완벽하지 않음 → 사용자 사전 유지보수가 필요.
  2. 복합어 처리 방식이 다양 → 적절한 모드 선택이 중요.
  3. 성능 이슈 가능 → 대량 문서 색인 시 성능 최적화 필요.

결론

  • Elasticsearch는 Nori 분석기를 통해 한국어 형태소 분석을 지원합니다.
  • 형태소 분석을 적용하면 검색 정확도를 크게 향상할 수 있습니다.
  • 사용자 사전을 활용하여 도메인 맞춤형 검색 환경 구축 가능.
  • 동의어 필터, 복합어 설정을 통해 검색 확장 가능.

🚀 Elasticsearch의 형태소 분석 기능을 활용하면 강력한 한국어 검색 시스템을 구축할 수 있습니다!

 

'Elastic Search > Elastic Search 이론' 카테고리의 다른 글

[Elasticsearch] 데이터 색인 (Indexing)  (0) 2025.02.01

+ Recent posts