클라우드

Elasticsearch의 내부구조, 관련용어 , mapping 타입

hex2.1 2024. 1. 31. 17:02
Elasitcsearch의 내부구조

 

 

 

MYSQL Elasticsearch
테이블 인덱스
레코드(행) 도큐먼트
컬럼 필드
스키마 매핑

*mysql과 비교했을때 elasticsearch의 구조는 다음과 같다 

 

-엘라스틱서치의 인덱스는 mysql에서의 테이블과 같다고 볼 수 있다

-데이터(도큐먼트)의 저장은 인덱스에 이루어진다

- 레코드 = 행 = 도큐먼트

- 컬럼 = 열 = 필드 

-인덱스는 여러 개의 primary샤드로 구성이 되고 고가용성을 위해 레플리카 샤드로도 복제된다

-프라이머리와 레플리카 샤드는 항상 서로 다른 노드에 할당되어 다중성과 확장성을 제공한다 

 

 

Elasticsearch 관련 용어 
  • node

-elasticsearch가 실행중인 하나의 프로세스 혹은 인스턴스를 말한다

-node는 데이터를 저장하고 cluster 내에서 역할에 따라 데이터의 색인화, 검색, 마스터 역할 등을 수행한다

-각 노드는 고유한 이름을 가지고 있는다

 

  • cluster

-하나 이상의 node로 구성된 elasticsearch 시스템 전체를 나타낸다 

-cluster는 데이터의 분산, 고가용성 및 확장성을 지원하며 모든 node가 동일한 클러스터명을 가지고 있어야 한다

  • shard

-데이터를 담기위한 논리적인 그룹이다

-데이터를 분산하여 저장하기 위해 index의 범위를 나눈것이라고 볼 수 있다

-실제 데이터가 담기는 곳은 index이고, 클러스터 상에서 이러한 index가 모여 하나의 shard를 이룬다

  • replica

-분산 환경에서 데이터의 신뢰성을 높이기 위해 여러 node에 데이터를 복제하여 저장하는것을 의미한다

-shard의 복제본을 의미하며 고가용성을 제공하고 성능을 향상시키기 위해 사용된다 

  • index

-도큐먼트를 담을 수 있는 일종의 테이블이라고 볼 수 있다

* index template: 여러개의 인덱스를 만들기 위한 기본 템플릿이며, 인덱스 템플릿에 정의된 데이터 타입 등이 인덱스에 적용된다 

--> 다수의 인덱스가 동일한 인덱스 형태를 취한다면 모든 인덱스는 동일한 데이터 타입으로 저장되어야 하므로 실수를 없애기 위해 미리 인덱스 템플릿을 만들어 두는것이 좋다 

* index pattern : 하나의 인덱스만으로는 시각화가 불가능하다. 다수의 동일한 패턴을 묶고 이를 인덱스 패턴으로 만든 뒤 이를 kibana와 연결하여 시각화 할 수 있다

 

Mapping

 

- mapping이란 인덱스에 도큐먼트를 입력 받을 때 필드에 대해 어떠한 형태의 데이터를 받을 것인가를 지정하는 것이다

--> 즉, " 각 데이터의 데이터 타입을 지정하는 것 " 이라고 할 수 있다

 

-동적인 mapping: 자동으로 특정 타입으로 매핑된다. 편리하지만 불필요하게 큰 메모리를 사용할 수도 있다

ex) "age"에 대하여 동적매핑을 할 경우 long 타입이 매핑된다. 이럴 경우 사용되는 값에 비해 너무 큰 메모리를 차지한다!

 

-정적인 mapping: 관리자가 직접 사전에 특정 타입을 미리 지정해두는 방법이다

PUT index1
{
  "mappings": {
    "properties": {
      "name": {"type":"text"},
      "age":{"type": "short"},
      "gender":{"type": "keyword"}
      
    }
  }
}

--> 다음과 같은 방법으로 정적인 mapping을 수행할 수 있다

 

- 인덱스 매핑이 정해지면 새로운 필드를 추가할 수는 있지만, 이미 정의된 필드를 수정하거나 삭제할 수 는 없다. 필드이름을 변경하거나 데이터 타입을 변경하기 위해서는 새로운 인덱스를 만들어 사용해야하므로 매핑 작업은 신중해야 한다!

 

 

 

 

mapping 타입
데이터 형태 데이터 타입 설명
텍스트 text 전문 검색이 필요한 데이터로 텍스트 분석기가 텍슽트를 작은 단위로 분리한다
keyword 정렬이나 집계에 사용되는 텍스트 데이터로 분석을 하지 않고 원문을 통째로 인덱싱한다
날짜 date 날짜/시간 데이터
정수 byte 부호 있는 8비트 데이터
short 부호 있는 16비트 데이터
integer 부호 있는 32비트 데이터
long 부호 있는 64비트 데이터
실수 float 32비트 부동소수점 실수 데이터
double 64비트 부동소수점 실수 데이터

*자주 쓰이는 mapping 타입들이다

 

 

text 타입 vs keyword 타입

 

-text 와 keyword 둘 다 문자열을 보관하기 위한 데이터 타입이지만 보관방식이 다르다

 

  • text타입

-elasticsearch에서 텍스트 타입은 일반적으로 문장을 저장하는 매핑 타입으로 사용된다

-일반적으로 문장이나 여러 단어가 나열된 문자열을 텍스트 타입으로 지정한다

-텍스트 타입으로 지정된 문자열은 분석기에 의해 토큰으로 분리되고, 분리된 토큰들은 인덱싱 되는데 이를 역인덱싱 이라고한다 

-역인덱스에 저장된 토큰들을 용어라고 한다 

 

' Hello everyone, my name is heewon '

 

다음과 같은 내용을 text로 저장했다고 해보자

텍스트가 "hello", "everyone" .. 과 같이 분리되고, 불필요한 토큰은 걸러지며 대소문자를 통일하는 등의 과정들을 거쳐 용어가 된다 .

이러한 용어들은 역인덱싱에 저장되어 전문 검색을 할 수 있게 된다 

즉, "everyone" 이라는 단어를 통해 문장 전체를 검색할 수 있게 된다는 것이다 

 

  • keyword 타입

-키워드 타입은 카테고리나 브랜드 등 규칙성이 있거나 유의미한 값들의 집합, 즉 범주형 데이터에 주로 사용된다

 

앞선 예시가 keyword 타입인 경우 전체문장을 하나의 용어로 만든다.

따라서 키워드 타입으로 매핑된 데이터는 부분 검색은 어렵지만 완전 일치 검색을 위해 사용될 수 있고, 집계나 정렬에 사용할 수 있다