[Elastic Search] 엘라스틱 서치를 구성하는 개념

엘라스틱 서치를 구성하는 개념

엘라스틱 서치의 데이터는 인덱스, 타입, 문서, 필드 구조로 구성된다.

인덱스

검색 시 인덱스 이름으로 문서 데이터를 검색하며, 여러 개의 인덱스를 병렬로 검색할 수 도 있다. 엘라스틱 서치가 분산환경으로 구성되면 하나의 인덱스는 여러 노드에 걸쳐 분산 저장된다. 또한 하나의 물리적인 노드에 여러개의 논리적인 인덱스를 가질 수 있다.

샤드

엘라스틱 서치는 인덱스 내부에 색인된 문서를 여러 물리적인 공간에 파티셔닝을 해서 저장하는데 이를 샤드라고 한다.

타입

타입은 인덱스의 논리적인 구조를 의미한다. 6.0 버전 이하에서는 하나의 인덱스는 여러 타입을 지정할 수 있었지만, 6.1 버전 이상부터는 하나의 인덱스는 하나의 타입만 가진다.

es multi type supports 관련 자료

문서

Document는 데이터가 저장되는 최소 단위이다. JSON 포멧으로 데이터가 저장되고 하나의 문서는 다수의 필드로 구성되어 있다. 또한 중첩 구조를 허용하기 때문에 문서 안에 문서를 포함하는것도 가능하다. RDB의 테이블 Row와 비슷한 개념이다.

필드

필드는 RDB의 테이블 Column과 비슷한 개념이다. 하지만 기존 RDB와는 다르게 Dynamic하다는 차이점이 있다. 하나의 필드는 목적에 따라 다수의 데이터 타입을 가질 수 있다.

매핑

매핑은 문서의 필드와 필드의 속성을 정의하고 그에 따른 색인 방법을 정의하는 프로세스이다. 인덱스의 매핑 정보에는 여러 데이터 타입을 지정할 수 있지만, 필드명은 중복이 될 수 없다.

노드의 종류

엘라스틱 서치에서는 설정들을 조합하여 다양한 노드 모드로 운영이 가능하다.

설정 가능한 옵션

1
2
3
4
node.master: 마스터 기능 활성화 여부
node.data: 데이터 기능 활성화 여부
node.ingest: ingest 기능 활성화 여부
search.remote.connect: 외부 클러스터 접속 가능 여부

지원하는 노드 모드

Single Node Mode

  • 싱글 노드가 모든 기능을 수행하는 모드
  • 특별한 옵션을 설정하지 않는다면 싱글 노드 모드로 동작

Master Node Mode

  • 인덱스 생성, 삭제 등의 클러스터와 관련된 전반적 작업을 담당하는 노드
  • 마스터 노드의 설정을 여러 노드에 걸쳐 가능하나, 선출된 마스터 노드는 1개

Data Node Mode

  • 실직적인 데이터 저장을 담당하는 노드
  • 검색, 통계 같은 데이터 관련 작업 수행

Coordination Node Mode

  • 사용자 요청을 받아 처리하는 노드
  • 클러스터 관련 요청은 마스터 노드에 전달하고 데이터 관련 요청은 데이터 노드에 전달
  • Round Robbin 방식으로 요청을 분산시킴

Ingest Node Mode

  • 문서의 전처리 작업을 담당
  • 인덱스 생성 전 문서의 형식을 다양하게 변경 가능
Node Mode \ Option node.master node.data node.ingest search.remote.connect
Single Node Mode true true true true
Master Node Mode true false false false
Data Node Mode false true false false
Ingest Node Mode false false true false
Coordination Node Mode false false false false

Schemaless

문서는 색인을 위해 인덱스를 생성하는 과정이 필요한데, 인덱스를 생성하는 과정 없이 문서를 추가하더라도 문서를 분석해 문서가 색인될 수 있게 자동으로 인덱스를 부여하는 기능이다. 스키마리스를 사용할 경우 모든 필드가 text 타입과 keyword 타입을 동시에 제공하는 멀티 필드 기능으로 구성되는데, 이러할 경우 멀티 필드가 필요하지 않는 상황이라면 스토리지 낭비를 유발시킨다. 또한 상황에 따라 검색 품질이 떨어지는 이슈가 발생하기도 한다.

1
2
### 원문 ###
"아버지가 방에 들어 가신다"

스키마리스를 사용하게 되면 기본적으로 text 타입의 Standard Analyzer를 사용하는 데이터 타입으로 정의된다. 이는 본문을 ["아버지가", "방에", "들어", "가신다"] 라는 토큰으로 분리시켜 Term을 생성하고 아버지라는 키워드를 통해 검색을 할 경우 해당 본문이 검색되지 않는다. 이럴때는 한글 형태소 분석기를 통해 데이터 타입을 직접 정의해야 원하는 결과를 얻을 수 있다. 또한 품질을 위해서라면 스키마리스 방식보단 인덱스를 직접 정의해서 사용하는 편이 좋다.

스미카리스를 명시적으로 비지정하고 싶다면 action.auto_create_index: false를 설정하면 된다.

Author: Song Hayoung
Link: https://songhayoung.github.io/2021/07/11/Elastic%20Search/chapter2/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.