600===Dev AWS/ElasticSearch

Elasticsearch가 DB보다 빠른 이유: 비밀은 역색인! 🚀

블로글러 2024. 10. 30. 23:15

안녕하세요! 오늘은 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만건
  • 데이터를 분산 저장
  • 병렬 검색으로 속도 향상

주의할 점 ⚠️

  1. 초기 색인 시간

    • 역색인 구조 생성에 시간 소요
    • 대량 데이터 입력 시 고려 필요
  2. 저장 공간

    • 역색인으로 인해 추가 저장공간 필요
    • 원본 데이터 + 역색인 데이터

마치며 🎁

Elasticsearch의 빠른 검색 속도는 '역색인'이라는 특별한 데이터 구조 덕분입니다. 마치 도서관의 색인 카드처럼, 검색할 내용을 미리 정리해두어 필요할 때 즉시 찾을 수 있죠!


더 궁금하신 점 있으시다면 댓글 남겨주세요! 😊

728x90