600===Dev AWS/ElasticSearch

Elasticsearch: 강력한 검색 엔진의 모든 것! 🔍

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

안녕하세요! 오늘은 검색 엔진의 절대 강자, Elasticsearch에 대해 알아볼게요!

Elasticsearch가 뭔가요? 🤔

여러분이 엄청 큰 도서관에 있다고 상상해보세요.

  • 수백만 권의 책이 있는데 특정 주제를 찾아야 한다면?
  • 일일이 책장마다 확인하는 건 불가능하죠!

Elasticsearch는 바로 이런 상황을 해결해주는 마법 같은 도구입니다!

  • 초대형 도서관의 완벽한 사서 🧙‍♂️
  • 모든 책의 내용을 미리 분석해서
  • 원하는 정보를 0.1초 만에 찾아주는 능력을 가졌어요

쉽게 말해서, Elasticsearch는:

  • 방대한 데이터에서 원하는 정보를 초고속으로 찾아주는 분산형 검색 엔진
  • JSON 기반으로 데이터를 저장하고 검색
  • 실시간으로 빠르게 분석할 수 있는 오픈소스 솔루션

어떻게 동작하나요? 🎬

1. 기본 아키텍처

클러스터 (대형 도서관)
  ├── 노드1 (1층 서가)
  │    ├── 샤드1 (역사 섹션)
  │    └── 샤드2 (과학 섹션)
  ├── 노드2 (2층 서가)
  │    ├── 샤드3 (문학 섹션)
  │    └── 샤드4 (예술 섹션)
  └── 노드3 (3층 서가)
       ├── 레플리카1 (역사 섹션 복사본)
       └── 레플리카2 (과학 섹션 복사본)

2. 데이터 저장하기 (인덱싱)

// 책 정보 저장하기
PUT /books/_doc/1
{
  "title": "엘라스틱서치 완벽 가이드",
  "author": "김데이터",
  "description": "초보자도 쉽게 배우는 검색 엔진",
  "publish_date": "2023-05-20",
  "categories": ["기술", "컴퓨터", "빅데이터"]
}

3. 데이터 검색하기

// '검색 엔진'이라는 단어가 포함된 책 찾기
GET /books/_search
{
  "query": {
    "match": {
      "description": "검색 엔진"
    }
  }
}

동작 방식 💫

마치 스마트한 도서관 사서가 일하는 것처럼 작동합니다!

  1. 색인(Indexing) - 책 정리하기Elasticsearch는 문서를 저장할 때 역색인(Inverted Index)이라는 특별한 자료구조를 만듭니다. 이건 마치:
    • 책의 맨 뒤에 있는 '찾아보기' 페이지와 같아요
    • '검색 엔진'이라는 단어가 포함된 모든 페이지 번호를 기록해둡니다
  2. 사서: "새 책이 들어왔네! 모든 단어를 카드에 기록하고 정리해둬야지"
  3. 분석(Analysis) - 똑똑하게 정리하기텍스트를 토큰으로 나누고, 대소문자 통일, 불용어 제거 등의 작업을 수행합니다.
  4. 사서: "검색엔진, 검색 엔진, Search Engine은 모두 같은 의미니까 함께 분류해두자!"
  5. 검색(Search) - 빠르게 찾아주기
  6. 방문자: "검색 엔진에 관한 책 있나요?" 사서: "네! 여기 3권 있습니다. 0.002초 걸렸어요!"

장점은? 🌟

  1. 초고속 검색
    • 수백만 개의 문서에서도 밀리세컨드 단위 검색 속도
    • 역색인 덕분에 일반 DB보다 최대 100배 빠름
  2. 유연한 스키마 🤸‍♀️
    • 미리 구조를 정하지 않아도 됨
    • 필요할 때 필드 추가 가능
    // 새 필드 추가해도 문제 없음!
    PUT /books/_doc/2
    {
      "title": "빅데이터 입문",
      "author": "박분석",
      "price": 25000,  // 새로운 필드!
      "categories": ["데이터", "기술"]
    }
    
  3. 강력한 분석 기능 📊
    • 다양한 집계(Aggregation) 기능
    • 복잡한 검색 쿼리 지원
    // 카테고리별 평균 가격 계산하기
    GET /books/_search
    {
      "size": 0,
      "aggs": {
        "category_stats": {
          "terms": {
            "field": "categories.keyword"
          },
          "aggs": {
            "avg_price": {
              "avg": {
                "field": "price"
              }
            }
          }
        }
      }
    }
    
  4. 확장성 📈
    • 데이터가 늘어나도 서버만 추가하면 OK
    • 수평적 확장 가능

주의할 점 ⚠️

  1. 메모리를 많이 사용해요
    • 검색 속도를 위해 많은 데이터를 메모리에 올림
    • 최소 8GB 이상 권장 (프로덕션은 16GB~32GB)
  2. 트랜잭션 지원이 약해요
    • 은행 계좌 관리같은 ACID 트랜잭션이 필요하면 다른 DB 추천
  3. 러닝 커브가 있어요
    • 강력한 만큼 배워야 할 것이 많음
    • Query DSL이 처음에는 복잡하게 느껴질 수 있음

실제 사용 예시 📱

1. 쇼핑몰 검색 엔진

// 상품 검색 - 노트북 중 가격이 100만원 이하인 제품
GET /products/_search
{
  "query": {
    "bool": {
      "must": {
        "match": {
          "name": "노트북"
        }
      },
      "filter": {
        "range": {
          "price": {
            "lte": 1000000
          }
        }
      }
    }
  }
}

2. 로그 분석 (ELK 스택)

// 오류 로그 검색 - 최근 1시간 내 500 에러
GET /logs-*/_search
{
  "query": {
    "bool": {
      "must": [
        { "match": { "status": 500 } }
      ],
      "filter": {
        "range": {
          "@timestamp": {
            "gte": "now-1h"
          }
        }
      }
    }
  }
}

3. 자동완성 구현

// 자동완성을 위한 인덱스 설정
PUT /autocomplete
{
  "mappings": {
    "properties": {
      "title": {
        "type": "search_as_you_type"
      }
    }
  }
}

// 자동완성 검색
GET /autocomplete/_search
{
  "query": {
    "multi_match": {
      "query": "엘라스틱",
      "type": "bool_prefix",
      "fields": [
        "title",
        "title._2gram",
        "title._3gram"
      ]
    }
  }
}

마치며 🎁

Elasticsearch는 마치 초능력을 가진 도서관 사서처럼, 방대한 데이터 속에서 원하는 정보를 번개처럼 빠르게 찾아줍니다. 단순한 키워드 검색부터 복잡한 텍스트 분석, 실시간 모니터링까지 - 데이터를 다루는 모든 곳에서 큰 힘을 발휘합니다!

시작이 어렵게 느껴질 수 있지만, 한번 익숙해지면 데이터의 바다에서 보물을 찾는 가장 강력한 동반자가 될 거예요! 😊


궁금한 점이 있으시면 댓글로 남겨주세요!

참고자료

728x90