이 글에서 얻는 것

  • Elasticsearch가 무엇이고, 언제 사용하는지 이해합니다.
  • 인덱스를 생성하고 문서를 저장할 수 있습니다.
  • 검색 쿼리를 작성하고 결과를 분석할 수 있습니다.
  • Spring Data Elasticsearch로 통합할 수 있습니다.

0) Elasticsearch는 “검색 특화 데이터베이스"다

왜 Elasticsearch인가?

RDBMS의 LIKE 검색:

-- ❌ 느린 검색
SELECT * FROM products
WHERE name LIKE '%맥북%'
   OR description LIKE '%맥북%';

-- 문제:
-- - Full Table Scan (인덱스 사용 불가)
-- - 대용량 데이터에서 매우 느림
-- - 형태소 분석 불가 ("맥북프로" 검색 시 "맥북 프로" 못 찾음)

Elasticsearch:

GET /products/_search
{
  "query": {
    "multi_match": {
      "query": "맥북",
      "fields": ["name", "description"]
    }
  }
}

// 장점:
// - 역인덱스로 빠른 검색 (ms 단위)
// - 형태소 분석으로 유연한 검색
// - 관련도 점수 (relevance score)

사용 사례

✅ 전문 검색: 상품 검색, 문서 검색
✅ 로그 분석: ELK Stack (Elasticsearch + Logstash + Kibana)
✅ 실시간 분석: 대시보드, 모니터링
✅ 자동완성: 검색어 추천

1) 핵심 개념

1-1) 인덱스 vs 도큐먼트

Elasticsearch      RDBMS
─────────────────  ──────────
Index              Database
Document           Row
Field              Column
Mapping            Schema

예시:

// Index: products
{
  "_id": "1",
  "_source": {
    "name": "맥북 프로 M3",
    "price": 2500000,
    "category": "노트북",
    "tags": ["Apple", "고성능"],
    "created_at": "2025-12-16"
  }
}

1-2) 역인덱스 (Inverted Index)

Elasticsearch의 핵심은 “단어(Term)“를 보고 “문서 ID(DocID)“를 찾는 역인덱스 구조입니다.

block-beta
  columns 3
  block:terms
    T1["맥북"]
    T2["프로"]
    T3["M3"]
  end
  space
  block:docs
    D1["Doc 1, 5"]
    D2["Doc 1, 3, 5"]
    D3["Doc 1"]
  end

  T1 --> D1
  T2 --> D2
  T3 --> D3

  style terms fill:#e3f2fd,stroke:#1565c0
  style docs fill:#fff3e0,stroke:#e65100
  • Term: 분석된 단어 (Token)
  • Posting List: 해당 단어를 포함하는 문서 ID 리스트

1-3) Cluster & Sharding Architecture

대용량 데이터를 처리하기 위해 ES는 데이터를 Shard 단위로 쪼개서 분산 저장합니다.

flowchart TB
    subgraph Cluster["ES Cluster (docker-cluster)"]
        direction TB
        Node1[Node 1 (Master/Data)]
        Node2[Node 2 (Data)]
        
        subgraph Shards
            P0[Primary Shard 0]
            R0[Replica Shard 0]
        end
        
        Node1 --> P0
        Node2 --> R0
    end

    style Cluster fill:#e3f2fd,stroke:#1565c0
    style Node1 fill:#fff9c4,stroke:#fbc02d
    style Node2 fill:#fff9c4,stroke:#fbc02d
    style P0 fill:#d1c4e9,stroke:#512da8
    style R0 fill:#e1bee7,stroke:#7b1fa2
  • Primary Shard: 원본 데이터 저장 (쓰기 발생)
  • Replica Shard: 복제본 (읽기 부하 분산, 고가용성)

👉 다음 편: Elasticsearch (Part 2: 시작과 실무 활용)