본문 바로가기
Infra/DB

[Elasticsearch]기초 알아가기 01.

by seeker00 2025. 6. 17.

elastic search 기초

데이터 구조

  • 클러스터: 하나의 프로젝트에 하나의 클러스터를 생성해 사용
  • 인덱스: 도큐먼트를 저장하는 논리적 구분자
  • 도큐먼트: 실제 데이터를 저장하는 단위, JSON 형태, 복수의 필드를 갖는다.

MySQL과 비교

MySQL 엘라스틱서치
테이블 인덱스
레코드 도큐먼트
컬럼 필드
스키마 매핑

매핑 mapping

엘라스틱서치 매핑으로 인덱스 스키마와 필드들의 데이터 타입을 지정할 수 있다.

타입 type

엘라스틱 7.x 이전 버전에 존재했던 데이터 구조이나, 현재는 더 이상 사용하지 않는다. 이전에 인덱스(테이블)처럼 동작했다.

  • 하나의 인덱스 내부에서 여러 타입을 지정할 수 있었다.
  • 즉, 인덱스 내부에 타입에 따라 각각 다른 스키마의 도큐먼트들을 저장할 수 있었다.

도큐먼트

  • 데이터가 저장되는 기본 단위로 JSON 형태이며 하나의 도큐먼트는 여러 필드와 값을 갖는다.
  • 도큐먼트는 반드시 하나의 인덱스에 포함돼야 한다.

인덱스

  • 인덱스는 영어 소문자를 비롯해 일부 문자를 제외한 특수문자를 사용할 수 있으며 255 바이트를 넘을 수 없다.

스키마에 따른 그룹핑

  • 일반적으로 스키마에 따라 인덱스를 구분한다.

관리 목적의 그룹핑

  • 인덱스가 너무 커지면 성능이 나빠지는 문제가 있으므로, 엘라스틱서치를 운용할 때 인덱스 용량 제한을 둔다.
    • 기본적으로 특정 도큐먼트 개수에 도달하거나 용량을 넘어서면 인덱스를 분리한다.
    • 일/주/월/년 단위 같은 날짜/시간 단위로 인덱스를 분리할 수 있다.
  • 효율적으로 대량의 데이터를 관리하기 위해 그룹핑을 수행한다.

es 기본 API

인덱스 생성/확인/삭제

PUT index1
GET index1
DELETE index1
  • 인덱스를 삭제하면, (당연히) 내부 도큐먼트들도 모두 삭제된다. 주의 필요!

도큐먼트 생성

인덱싱 indexing

  • 도큐먼트는 반드시 하나의 인덱스에 포함되어야 하며, 이러한 작업을 인덱싱이라고 한다.
PUT hidle/_doc/1
{
  "name": "han",
  "age": 20,
  "region": "충청도",
  "gender": "male"
}

GET hidle
  • 기존에 존재하지 않는 인덱스라면, 도큐먼트와 함께 생성한다.
  • 타입을 따로 지정하지 않아도 도큐먼트의 필드와 값을 보고 자동으로 매핑을 지정한다. 이런 기능을 다이내믹 매핑이라고 한다.
PUT hidle/_doc/2
{
  "name": "kang",
  "region": "경상도"
}

PUT hidle/_doc/3
{
  "name": "park",
  "age": "20",
  "gender": "female"
}
  • 인덱스 조회 결과

    {
    "hidle": {
      "aliases": {},
      "mappings": {
        "properties": {
          "age": {
            "type": "text",
            "fields": {
              "keyword": {
                "type": "keyword",
                "ignore_above": 256
              }
            }
          },
          "city": {
            "type": "text",
            "fields": {
              "keyword": {
                "type": "keyword",
                "ignore_above": 256
              }
            }
          },
          "gender": {
            "type": "text",
            "fields": {
              "keyword": {
                "type": "keyword",
                "ignore_above": 256
              }
            }
          },
          "name": {
            "type": "text",
            "fields": {
              "keyword": {
                "type": "keyword",
                "ignore_above": 256
              }
            }
          },
          "region": {
            "type": "text",
            "fields": {
              "keyword": {
                "type": "keyword",
                "ignore_above": 256
              }
            }
          }
        }
      },
      "settings": {
        "index": {
          "routing": {
            "allocation": {
              "include": {
                "_tier_preference": "data_content"
              }
            }
          },
          "number_of_shards": "1",
          "provided_name": "hidle",
          "creation_date": "1749987416355",
          "number_of_replicas": "1",
          "uuid": "WH17k0DNQIKYOGcuRe-39w",
          "version": {
            "created": "8518000"
          }
        }
      }
    }
    }
  • 새로운 필드 데이터가 들어오면 자동으로 필드가 추가된다.

  • 데이터 타입을 잘못 지정해도 엘라스틱서치가 스키마에 유연하게 대응하여 타입을 변환해 저장한다.

대표적인 형변환 규칙

  • 숫자 필드에 문자열이 입력되면 숫자로 변환을 시도한다.
  • 정수 필드에 소수가 입력되면 소수점 아래 자리를 무시한다.

도큐먼트 읽기

크게 2가지 방법이 있다.

  • 도큐먼트 아이디를 이용하여 조회하는 방법
    • 빅데이터 환경에서 도큐먼트 하나씩 조회하는 경우는 드물기에 잘 사용되지 않는다.
  • 엘라스틱 서치가 제공하는 쿼리 DSL(Domain Specific Language)을 이용하여 검색
GET hidle/_doc/3

// 형변환 규칙과 관련 - 아래 응답을 보면 age에 "20"으로 값이 들어가 있다.
{
  "_index": "hidle",
  "_id": "3",
  "_version": 1,
  "_seq_no": 2,
  "_primary_term": 1,
  "found": true,
  "_source": {
    "name": "park",
    "age": "20",
    "gender": "female"
  }
}

// DSL 쿼리, 인덱스 내 모든 도큐먼트 조회
GET hidle/_search

도큐먼트 수정

  • 생성과 동일한 API 활용
    -도큐먼트를 인덱싱하는 과정에서 같은 도큐먼트 아이디가 있으면 덮어쓰기로 처리한다.

    • API 응답 결과에 도큐먼트가 업데이트 되었다고 나온다.

      PUT hidle/_doc/1
      {
      "name": "choi",
      "age": 20,
      "region": "충청도"
      }
  • update API 이용

    • 특정 필드의 값만 업데이트 할 수 있다.

      POST hidle/_update/1
      {
      "doc": {
      "name": "choi"
      }
      }
  • 엘라스틱서치 도큐먼트 수정 작업은 비용이 많이 들어서 권장되지 않는다.

    • 개별 도큐먼트 수정이 많은 작업이라면 엘라스틱서치가 아닌 다른 DB를 이용하는 것이 좋다.

도큐먼트 삭제

DELETE hidle/_doc/2
  • 도큐먼트 수정과 마찬가지로 개별 도큐먼트 삭제 또한 비용이 많이 들어가는 작업인 만큼 사용에 주의가 필요하다.

벌크 데이터 API

PUT /_bulk
{"index": {"_index": "hidle", "_id": "1"}}
{"name":"han", "gender":"male", "region":"충청도"}
{"create": {"_index": "hidle", "_id": "5"}}
{"name":"hwang", "gender":"female", "region":"경상도"}
{"create": {"_index": "hidle", "_id": "4"}}
{"name":"choi", "gender":"male", "region":"충청도"}
{"update": {"_index": "hidle", "_id": 4}}
{"doc":{"age": 20}}
{"delete": {"_index": "hidle", "_id": "5"}}
  • 벌크로 한 번에 요청을 하는 것이 효율적이다.
    • API 콜 횟수를 줄여 성능을 높일 수 있다.
  • bulk API 는 읽기는 지원하지 않고 생성/수정/삭제만 지원한다.
    • 삭제(delete)만 한 줄로 작성하고 나머지 작업들(index, create, update)은 두 줄로 작성한다.
  • NDJSON(New-line Delimited JSON) 형태의 문법을 사용한다.
    • 각 줄 사이에 쉼표 등 별도의 구분자 없이 줄바꿈만 수행하며, 라인 사이의 공백을 허용하지 않는다.
  • 벌크 데이터를 파일 형태로 만들어 적용하는 방법도 있다.
    • 현업에서 실용성 있게 활용 가능
  • 참고) PUT indexname/_bulk 형태로도 작성할 수 있다.

참조 자료