최근 동아리 프로젝트를 진행하면서 엘라스틱서치에 도전해보고 있다. 관련해서 지식이 부족하다는 생각에 엘라스틱 서치 실무 가이드 책을 통해 관련 지식을 습득하고 내용을 정리해보자!
엘라스틱 서치에 대해 알아보기 전에 검색 시스템에 대한 간단한 이해가 필요할 것 같다.
검색 시스템이란?
대용량 데이터를 기반으로 신뢰성 있는 검색 결과를 제공하기 위해 검색엔진을 기반으로 구축된 시스템을 통칭하는 용어
여기서 엘라스틱서치는 검색엔진에 해당하는 기술이다. 그리고 이 검색 시스템을 이용해서 다양한 서비스를 제공하는 것을 검색 서비스라고 한다. 즉 정리하면
검색 서비스 > 검색 시스템 > 검색 엔진
이렇게 생각해볼 수 있다.
웹사이트, 블로그, 카페 등 웹에서 필요한 정보를 수집하는 프로그램으로 크롤러, 스파이더, 웜, 웹 로봇 등으로 불린다.
데이터를 저장하는 물리적인 저장소로 검색엔진은 색인한 데이터를 스토리지에 저장한다.
다양한 형태소 분석기를 조합해 정보에서 의미 있는 용어를 추출하고 검색에 유리한 역색인 구조로 데이터를 저장한다.
사용자 질의를 입력받아 색인기에서 저장한 역색인 구조에서 일치하는 문서를 찾아 결과로 반환한다. 검색기 또한 색인기와 마찬가지로 형태소 분석기를 이용해 사용자 질의에서 유의미한 용어를 추출해 검색한다.

엘라스틱 서치는 아파치 재단의 루씬(Lucene)을 기반으로 개발된 오픈소스 검색 엔진이다.
먼저 대표적인 장점에 대해 알아보자.
이번엔 약점에 대해 알아보자.
엘라스틱 서치를 구성하는 다양한 개념과 관련 용어들에 대해 알아보자

인덱스는 데이터 저장 공간으로 하나의 인덱스는 하나의 타입만 가지며, 하나의 물리적인 노드에 여러 개의 논리적인 인덱스를 생성할 수 있다. 분산환경에서는 여러 개의 노드에 걸쳐 인덱스가 저장되므로 고가용성, failover 등 분산에 따른 장애환경에 대응할 수 있는 장점을 얻을 수 있다.
❗️ 참고
인덱스의 이름은 모두 소문자여야 하며, CRUD는 RESTful API로 수행할 수 있다. 인덱스가 없는 상태에서 데이터가 추가된다면 데이터를 이용해 인덱스가 자동 생성된다.
색인된 문서는 하나의 인덱스에 담기는데, 인덱스 내부에 색인된 데이터는 물리적인 공간에 여러 개의 파티션으로 구성된다. 이 파티션을 ES에서는 샤드라고 부른다. 이 샤드 또한 분산되기 때문에 데이터 유실 위험을 줄일 수 있다.
타입은 인덱스의 논리적인 구조를 의미하며 6.0 버전까지는 하나의 인덱스에 여러 개의 타입을 설정할 수 있었지만, 6.1부터는 인덱스 당 하나의 타입만 설정 가능하다.
데이터가 저장되는 최소 단위로 기본적으로 Json 포맷으로 데이터가 저장된다. 하나의 문서는 다수의 필드로 구성돼 있는데 각 필드는 데이터의 형태에 따라 용도에 맞는 데이터 타입을 정의해야 한다. 또한 문서 안에 문서를 중첩하여 지정하는 것도 가능하다.
필드는 문서를 구성하기 위한 속성이라고 할 수 있다. 하나의 필드는 목적에 따라 다수의 데이터 타입을 가질 수 있다.
문서의 필드와 필드 속성을 정의하고 그에 따른 색인 방법을 정의하는 프로세스다. RDB로 따지면 스키마를 정의하는 것과 같다.
인덱스를 생성, 삭제하는 등의 클러스터와 관련된 전반적인 작업을 담당한다.
문서가 실제로 저장되는 노드로 샤드가 배치된다. 색인 작업은 컴퓨팅 리소스를 많이 소모하므로 모니터링이 필요하다. 웬만하면 마스터 노드와 데이터 노드는 분리하는 것이 좋다.
들어온 요청을 라운드로빈 방식으로 분산시켜주는 노드이다.
색인에 앞서 데이터를 전처리하는 노드이다.

인덱스를 생성할 때 프라이머리 샤드와 레플리카 샤드를 설정하게 되어 있다.
다음 그림처럼 프라이머리 샤드는 2세트 레플리카 샤드도 2세트이다. 레플리카 샤드는 프라이머리 샤드가 다운되면 프라이머리로 승격되어 사용된다. 그림처럼 샤드가 각 노드에 분배되어 데이터가 저장되기 때문에 장애 대응에 효과적이다.
엘라스틱 서치의 가장 기본적인 용어들과 개념들에 대해 나열식으로 알아보았다. 검색 엔진 특성 상의 역인덱스 개념과 용어들에 대해 정리할 수 있어 좋았고, 결국 분산시스템 근본적으로 엄청나게 다른 것 같지는 않다는 것을 느끼는 것 같다. 다음 포스트에서 좀 더 딥하게 알아보자!