안녕하세요! 오늘은 Elasticsearch가 왜 일반 DB보다 검색이 빠른지, 그 핵심 원리를 파헤쳐볼게요.
DB vs Elasticsearch 검색 방식 비교 🤔
일반 DB의 검색 방식
SELECT * FROM books WHERE content LIKE '%elasticsearch%'
- 테이블의 모든 row를 순차적으로 스캔 (Full Table Scan)
- 마치 도서관에서 모든 책을 한권씩 펼쳐보는 것과 같아요!
Elasticsearch의 검색 방식
GET /books/_search
{
"query": {
"match": {
"content": "elasticsearch"
}
}
}
- 미리 만들어둔 역색인(Inverted Index)을 통해 즉시 검색
- 도서관의 색인 카드처럼, 단어별로 어디에 있는지 미리 정리해둬요!
역색인(Inverted Index)이란? 📚
1. 기본 개념
일반 문서:
문서1: "엘라스틱서치는 검색엔진이다"
문서2: "검색엔진은 빠르다"
문서3: "엘라스틱서치로 로그를 수집한다"
역색인 결과:
엘라스틱서치 → 문서1, 문서3
검색엔진 → 문서1, 문서2
빠르다 → 문서2
로그 → 문서3
수집 → 문서3
2. 상세 구조
{
"terms": {
"엘라스틱서치": {
"docs": [1, 3],
"positions": {
"1": [0],
"3": [0]
}
},
"검색엔진": {
"docs": [1, 2],
"positions": {
"1": [2],
"2": [0]
}
}
}
}
왜 이렇게 빠른가? 🏃♂️
1. 데이터 구조의 차이
RDBMS
책 제목 | 내용 | 저자
프로그래밍 | 자바는 객체지향... | 김개발
- 순차적 검색 필요
- 내용 전체를 스캔해야 함
Elasticsearch
단어: [문서ID, 위치, 빈도수]
자바: [1번문서:2회, 3번문서:1회]
객체지향: [1번문서:1회, 4번문서:3회]
- 해시테이블처럼 즉시 접근
- 검색어가 있는 문서만 조회
2. 성능 비교 예시
100만건의 데이터에서 "프로그래밍" 검색 시:
RDBMS: 100만건 모두 확인 필요
↓
Elasticsearch: 역색인에서 즉시 찾음 (O(1) 시간복잡도)
실제 구현 예시 💻
1. 역색인 생성 과정
@Service
public class IndexingService {
public void indexDocument(String text, String documentId) {
// 1. 형태소 분석
List<String> tokens = analyzer.analyze(text);
// 2. 역색인 구조 생성
for (String token : tokens) {
invertedIndex.computeIfAbsent(token, k -> new HashSet<>())
.add(documentId);
}
}
}
2. 검색 구현
@Service
public class SearchService {
public Set<String> search(String keyword) {
// 검색어에 해당하는 문서 ID들을 즉시 반환
return invertedIndex.getOrDefault(keyword, Collections.emptySet());
}
}
추가 성능 최적화 기법 🔧
1. 필터 캐시
{
"query": {
"bool": {
"must": { "match": { "content": "elasticsearch" }},
"filter": { "term": { "status": "published" }}
}
}
}
- 자주 사용되는 필터는 캐시로 저장
- 재사용시 즉시 결과 반환
2. 샤딩(Sharding)
문서 100만건
↓
샤드1: 33만건
샤드2: 33만건
샤드3: 34만건
- 데이터를 분산 저장
- 병렬 검색으로 속도 향상
주의할 점 ⚠️
초기 색인 시간
- 역색인 구조 생성에 시간 소요
- 대량 데이터 입력 시 고려 필요
저장 공간
- 역색인으로 인해 추가 저장공간 필요
- 원본 데이터 + 역색인 데이터
마치며 🎁
Elasticsearch의 빠른 검색 속도는 '역색인'이라는 특별한 데이터 구조 덕분입니다. 마치 도서관의 색인 카드처럼, 검색할 내용을 미리 정리해두어 필요할 때 즉시 찾을 수 있죠!
더 궁금하신 점 있으시다면 댓글 남겨주세요! 😊
728x90
'600===Dev AWS > ElasticSearch' 카테고리의 다른 글
Elasticsearch: 강력한 검색 엔진의 모든 것! 🔍 (0) | 2024.10.30 |
---|---|
What is an inverted index, and why is it crucial for ElasticSearch? (0) | 2024.06.09 |
ElasticSearch Introduced (0) | 2024.06.09 |