Post

01 ElasticSearch 개념

01 ElasticSearch 개념

1. Note

1. Note

  • 벡터 디비와 어느정도 구분이 필요할듯
    • 벡터디비는 임베딩시켜서 의미를 기반으로 검색
    • 엘라스틱서치는 제이슨으로 만들어서 조건이나 키워드를 검색함.
    • 각기 상황에 대한 목적이나 방향성을 보고 무엇을 할지 선택해야할듯
  • 벡터DB, 엘라스틱서치

    구분벡터DB엘라스틱서치
    검색 방식의미 유사도키워드/조건 매칭
    입력자연어 문장 많이 사용JSON DSL 많이 사용
    내부 비교벡터 거리 계산inverted index
    강점의미 이해정확한 필터링/속도
    예시“강아지 키우기 팁” ≈ “반려견 초보 가이드”“title에 강아지 포함”
  • 엘라스틱서치는
    • JSON의 텍스트 필드를 토큰으로 분해해 역색인을 만들고,
    • 조회 시 그 역색인을 이용해 “문서 후보”를 찾음
  • 조회하는 방법은
    • 병렬로!!
    • 각 샤드에서 역색인을 이용해 문서 후보를 찾고
    • BM25로 각 후보 문서의 관련도를 점수화한 뒤
    • score 기준으로 정렬
  • 정리하면
    • 사용자 입장에서는 특정 데이터를 조회하는건데
    • 엘라스틱서치 입장에서는 알고리즘에 의한 데이터 정렬

2. ElasticSearch

1. ElasticSearch

  • 오픈소스 기반의 대용량 데이터를 빠르게 검색하고 조회하기 위한 분산 검색 엔진
  • 데이터를 저장하면서, 그 데이터를 매우 빠르게 검색·분석할 수 있게 만든 검색 특화 데이터베이스에 가까움
  • 검색을 위해 데이터를 색인(Indexing)해서 빠르게 찾아주는 엔진

2. ElasticSearch 흐름

1. 저장 단계 (Indexing)

  • JSON 데이터를 검색 가능한 구조로 바꾸는 과정
  • 내부작업
    • JSON 문서 입력
    • analyzer로 텍스트 분해
    • 역색인(inverted index) 생성
    • _source에 원본 JSON 저장
    • doc values 생성 (정렬/집계용)
    • 샤드(Lucene)에 저장

2. 검색 단계 (Query Execution)

  • 조건에 맞는 문서 찾기
  • 내부작업
    • 쿼리 입력
    • 모든 샤드에 병렬 요청
    • 각 샤드에서 역색인으로 문서 찾음 / score 계산 (BM25)
    • 결과 일부(top N) 반환 (쿼리에 따른 결과)

3. 정렬/결과 합치기 (Reduce Phase)

  • 전체 결과를 하나로 합쳐 최종 응답 생성
  • 흐름
    • 각 샤드 결과 수집
    • score 기준으로 정렬 (또는 sort 기준)
    • top K 선택
    • _source에서 JSON 추출(원본추출)
    • 최종 결과 반환

3. 주요특징

1. 매우 빠른 검색 성능

  • 일반 DB처럼 데이터를 처음부터 끝까지 찾는 방식이 아니라, 역색인(Inverted Index) 기반으로 검색
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    
    -- 일반적인 DB는 전체를 순서대로 맥북을 조회하여 일치여부를 검증함.
    SELECT *
    FROM product
    WHERE name LIKE '%맥북%'
      
    -- 엘라스틱 서치는 데이터가 있다면
    1번 문서: 맥북 프로
    2번 문서: 아이패드 프로
    3번 문서: 맥북 에어
      
    -- 단어 중심으로 색인을 구성
    맥북 → 1,3
    프로 → 1,2
    아이패드 → 2  
    
  • 검색할 때 계산하는 것이 아니라, 저장할 때 검색 준비를 끝내두는 것에 가까움

2. 전문 검색(Full Text Search)에 강함

  • 사람이 실제 검색하는 방식에 가까운 검색을 지원
    • 오타 허용(Fuzzy Search)
    • 유사 단어 검색
    • 부분 일치 검색
    • 문맥 기반 검색
  • 흐름
    1
    2
    3
    4
    5
    
    # 검색문장
     '쿠버네티스를 공부하고 있습니다'
      
    # 핵심단어 추출하여 조회
     '쿠버네티스','공부'
    

3. JSON 기반 Document 저장 구조

  • 엘라스틱서치는 데이터를 JSON 형태(Document) 로 저장
    1
    2
    3
    4
    5
    6
    
    {
    "name": "맥북 프로",
    "price": 3200000,
    "brand": "Apple"
    }
    # 새로운 속성이 생겨도 그냥 Key만 추가하여 유연하게 저장 가능함
    
  • 지속적으로 쌓이고 변경되는 경우 유리함.
    • 로그 데이터
    • 사용자 이벤트
    • 비정형 데이터
    • AI 메타데이터

4. Near Real Time 검색 지원

  • 데이터를 저장하고 거의 즉시 검색 가능함
  • Near Real Time (준실시간)
    • 상품을 등록하면 몇 초 안에 검색 결과에 노출될 수 있음
    • 성능 최적화를 위해 데이터를 즉시 검색 가능 상태로 만들지 않고, 일정 주기마다 refresh를 수행

5. 분산 처리와 수평 확장(Scale Out)

  • 처음부터 대용량 분산 환경을 고려해 설계
  • 데이터가 많아지면 단순히 서버 성능만 높이는 것이 아니라 서버를 추가 해서 확장할 수 있음
    • 하나의 Cluster로 구성
    • 데이터는 내부적으로 Shard(샤드) 단위로 분산 저장
  • 데이터가 커질수록 서버를 붙여서 확장하기 쉬운 구조

6. 장애 대응(High Availability)

  • 데이터 복제를 통해 장애 상황에도 대응할 수 있음
  • Primary Shard, Replica Shard로 구성됨.
    • Primary Shard가 문제가 생기면 Replica shard가 대체됨
    • 검색 서비스 안정성이 높으며, 대규모 서비스 환경에서 많이 사용하게됨

7. 강력한 집계(Aggregation) 기능

  • 단순 검색 엔진이 아니라 분석 엔진 역할도 수행
    • 카테고리별 판매량
    • 가장 많이 검색된 키워드
    • 평균 결제 금액
    • 시간대별 사용자 수

8. REST API 기반 동작

  • 엘라스틱서치는 대부분 기능을 HTTP API 로 제공
    1
    2
    
    POST /products/_doc # 저장
    GET /products/_search # 검색 
    
  • JSON 기반 요청/응답 구조라서, Spring Boot와 같은 백엔드 프레임워크와 연동하기 쉬움
  • HttpMethod에 따라서 작업이 달라지게됨

3. ElasticSearch 구조

1. 구조

1. 전체구조

  • 내 그림
  • 레벨
    1
    2
    3
    4
    5
    
     Cluster (전체 시스템)
     └── Node (개별 서버, 여러 대)
           └── Index (문서 묶음, MySQL의 DB와 비슷)
                 └── Shard (Index의 조각, 분산 저장 단위)
                       └── Document (실제 데이터, JSON 한 건)
    

2. 클러스터

  • 클러스터
    • 여러 개의 노드를 하나의 검색 시스템처럼 묶은 단위
    • 하나의 검색 서비스를 위해 여러 노드가 협력하는 구조
  • 주요 역할
    • 데이터 저장 및 검색 관리
    • 노드 간 데이터 분산
    • 장애 발생 시 복구
    • 검색 요청 병렬 처리
  • 클러스터 상태

    상태의미
    GreenPrimary + Replica 샤드 모두 정상
    YellowPrimary 정상, Replica 일부 미배치
    RedPrimary 샤드 손실 → 일부 데이터 검색 불가

3. 노드

  • 노드
    • Elasticsearch가 실행되는 서버(인스턴스) 1대
    • 클러스터 내부에서 실제 CPU, 메모리, 디스크 자원을 사용하여 검색과 저장 작업을 수행
    • Coordinating Node가 필요한 Data Node들에 요청해서 데이터를 찾고 결과를 합침
  • 주요 역할
    • 검색 요청 처리
    • 샤드 저장
    • 데이터 분산 처리
    • 병렬 검색 수행
  • 노드 역할 종류

    역할설명
    Master Node클러스터 상태 관리 및 노드/샤드 관리
    Data Node실제 데이터 저장 및 검색 수행
    Ingest Node데이터 전처리(Pipeline) 수행
    Coordinating Node요청 분배 및 결과 병합
    ML Node머신러닝 작업 수행

4. 샤드

  • 샤드
    • 데이터를 여러 조각으로 분산 저장하는 단위
    • 대용량 데이터를 효율적으로 처리하기 위해 데이터를 여러 개로 나누어 저장
  • 샤드 구성
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    
    # 각 데이터 노드는 N개의 샤드를 가짐
    # DataNode에만 붙는거는 맞지만, 몇개가 붙는지는 Master Node가 결정함.
    Node1 (Data Node)
    ├─ Primary Shard1
    └─ Replica Shard2
      
    Node2 (Data Node)
    ├─ Primary Shard2
    └─ Replica Shard3
      
    Node3 (Data Node)
    ├─ Primary Shard3
    └─ Replica Shard1
    
  • 샤드 종류

    종류설명
    Primary Shard원본 데이터 저장
    Replica ShardPrimary 복제본, 장애 대응 및 읽기 성능 향상
  • 샤드 내부구조
    • 역색인 (Inverted Index)
      • 검색용 구조
      • “단어 → 문서 목록”
    • _source (원본 JSON)
      • 문서 전체 JSON을 그대로 저장
      • 기본적으로 압축된 형태로 저장됨
      • 응답에서 그대로 반환되는 핵심 데이터
    • Stored Fields (선택 저장 필드)
      • 일부 필드만 따로 저장 가능
      • _source 없이도 일부 값 반환하려고 사용
    • Doc Values
      • 정렬, 집계용 컬럼 기반 구조
      • 예: price 정렬, aggregation 계산
This post is licensed under CC BY 4.0 by the author.