이 글에서 얻는 것
- 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: 복제본 (읽기 부하 분산, 고가용성)
💬 댓글