본문 바로가기

Backend Study/ELK Stack

[Elastic Search] 기본 개념잡기

Elastic search란?

Apache Lucene( 아파치 루씬 ) 기반의 Java 오픈소스 분산 검색 엔진이다. Elasticsearch를 통해 루씬 라이브러리를 단독으로 사용할 수 있게 되었으며, 방대한 양의 데이터를 신속하게, 거의 실시간( NRT, Near Real Time )으로 저장, 검색, 분석할 수 있다.  스럽에서는 주로 검색을 위해 활용하고 있다. 

본격적인 Elastic Search를 스터디하기 전에 검색 시스템에 대해 알아보자.

 

1. 검색 시스템이란 무엇인가?

검색 시스템이란?

검색 시스템은 사용자가 원하는 정보를 빠 르게 검색할 수 있는 기능을 제공하는 소프트웨어 시스템이다. 네이버와 구글에서 사용자들이 가장 많이 쓰는 서비스는 사용자가 원하는 검색어에 대한 결과를 제공하는 검색 기능이라고 할 수 있다. 이를 부르는 용어는 다양한데, 가장 흔히 검색 엔진, 검색 시스템, 검색 서비스 등을 많이 사용한다.

 

- 검색 엔진 

광활한 웹에서 정보를 수집해 검색 결과를 제공하는 프로그램이다. 검색 엔진은 검색 결과로 제공되는 데이터의 특성에 따라 구현 형태가 각각 달라진다. (야후가 최초로 제공하였다. ) 요즘에는 뉴스, 블로그, 카페 등 대범주에 따른 카테고리별 검색 결과를 검색 업체에서 제공하고 있다. 

 

- 검색 시스템 

대용량 데이터를 기반으로 신뢰성 있는 검색 결과를 제공하기 위해 검색 엔진을 기반으로 구축된 시스템을 통칭하는 용어이다. 수집기를 이용해 방대한 데이터를 수집하고 이를 다수의 검색엔진을 이용해 색인하여 검색 결과를 UI로 제공한다. 시스템 내부의 정책에 따라 관련도가 높은 문서를 검색 결과의 상위에 배치할 수 있을뿐더러 특정 필드나 문서에 가중치를 둬서 검색의 정확도를 높일 수 있다. 

** 검색 시스템이 현재 스럽에서 내가 개발하고자 하는 파트이다. 

 

- 검색 서비스

검색 엔진을 기반으로 구축한 검색 시스템을 활용해 검색 결과를 서비스로 제공한다. 

간단히 검색 서비스 > 검색 시스템 > 검색 엔진 이렇게 생각할 수 있다! 

 

검색 시스템을 개발하기 위해서는 가장 먼저 검색 시스템의 구성 요소를 분명히 알고 있는것이 필요하다. 검색 시스템의 구성 요소에 대해 살펴보자.

 

+ 현재 내가 개발하고 있는 서비스에서 검색 시스템의 필요성이 있다. (유사한 이유로 검색 시스템을 개발하고자 하신다면 참고하면 좋을 것 같아 설명을 첨부해본다!)

Sluv 서비스에서 아이템 혹은 셀럽을 검색하는 기능을 제공하고있다. 이 기능은 유저에게 빠르고 정확한 정보를 제공하는 것이 매우 중요한 요소이다.

기존 기능에서는 Mysql에 저장된 데이터를 SQL문으로 불러와 데이터를 보여주고 있었다.  이는 동의어, 유사어, 복합어 처리 검색이 어렵다는 점이 큰 단점이 있다. 예를 들어 아래의 화면에서 셀럽명을 "stray kids"라고 검색해도, "스트레이키즈 승민"과 일치하지 않기 때문에 원하는 결과를 얻을 수 없었다. (일반적인 검색 엔진이라면 가수 스트레이 키즈와 관련된 데이터들이 보여질 것이다.) 이러한 단점은 유저의 만족도를 크게 저하시키는 요소가 될 것으로 예상된다. 

 

 

이를 보안하기 위해 검색 시스템을 구축하기로 결정하였다.

검색 및 분석을 위한 오픈 소스 분산 검색 엔진 중 가장 보편적으로 사용되는 Elastic search를 선택하였고, 확장성을 고려하여 어플리케이션과 분리하여 개발중에 있다. 동의어, 유사어 등의 처리를 가능하게하고, 데이터를 색인화 하여 저장함으로써 규모가 커졌을 때에도 처리 속도가 느려지지 않도록 하여 유저에게 좋은 경험을 주는 것이 목표이다 🙂

 

본격 개발 전에 Elastic Search와 검색 시스템의 기본 개념과 활용에 대해서 알아보자.

 

2. 검색 시스템의 구성 요소 

검색 시스템은 크게 수집기, 스토리지, 색인기, 검색기 등의 구성 요소를 가진다.

 

- 수집기

수집기는 웹사이트, 블로그, 카페 등 웹에서 필요힌 정보를 수집하는 프로그램이다. 크롤러, 스파이, 더, 웜 등으로도 불리며 파일, 데이터베이스, 웹 페이지 등 웹 상의 대부분의 정보가 수집 대상이다.

 

- 스토리지 

데이터베이스에서 데이터를 저장하는 물리적인 저장소다. 검색엔진은 색인한 데이터를 스토리지에 보관한다. 

 

- 색인기 

검색엔진이 수집한 정보에서 사용자 질의와 일치하는 정보를 찾으려면 수집한 데이터를 검색 가능한 구조로 가공하고 저장해야한다. 그 역할을 하는 것이 색인기다. 색인기는 다양한 형태소 분석기를 조합해 정보에서 의미가 있는 용어를 추출하고 검색에 유리한 역색인 구조로 데이터를 저장한다.

 

- 검색기 

검색기는 사용자 질의를 입력받아 색인기에서 저장한 역색인 구조에서 일치하는 문서를 찾아 결과로 반환한다. 질의와 문서가 일치하는지도 유사도 기반의 검색 순위 알고리즘으로 판단한다. 검색기또한 색인기와 마찬가지로 형태소 분석기를 이용해 사용자 질의에서 유의미한 용어를 추출해 검색한다. 따라서 사용하는 형태소 분석기에 따라 검색 품질이 달라진다. 

 

* 핵심은 어떤 데이터를 어떤 형태소 분석기를 사용하고, 검색할건지에 따라서 품질이 크게 달라진다는 것이다 ! 

 

 

3. Elastic Search  VS  관계형 데이터베이스

기존 스럽에서는 관계형 데이터베이스로 데이터를 저장하고, SQL문으로 데이터를 검색하고 있다.

관계형 데이터베이스와 검색 엔진의 차이점을 살펴보자.

 

데이터베이스는 데이터를 통합 관리하는 데이터의 집합이다. 모든 데이터는 중복을 제거하고 정형 데이터로 구조화해 행과 열로 구성된 테이블에 저장된다. sql문을 이용해 원하는 정보의 검색이 가능한데 이는 텍스트 매칭을 통한 단순한 검색만 가능하다. (여러 개의 동의어나 유의어를 활용한 검색은 불가능하다.)

 

반면 검색엔진은 데이터베이스에서는 불가능한 비정형 데이터를 색인하고 검색할 수 있다. 형태소 분석을 통해 사람이 구사하는 자연어의 처리가 가능해지고 역색인 구조를 바탕으로 빠른 검색 속도를 보장한다.

 

엘라스틱서치도 관계형 데이터베이스와 유사한 개념들을 가진다. 하지만 생각보다 DB에서 사용하는 명칭과 다르니 혼동이 되지 않도록 주의하자.

 

엘라스틱 서치 관계형 데이터베이스
인덱스 데이터베이스
샤드 파티션
타입 테이블
문서
필드
매핑 스키마
Query DSL SQL

 

 

추가로 일반적인 RESTFUL API와 조금은 다른 HTTP 메서드를 사용할 수 있으니 이 점도 주의해서 사용해야한다.

 

엘라스틱서치에서 사용하는 HTTP 메서드 기능 데이터베이스 질의 문법
GET 데이터 조회 SELECT
PUT 데이터 생성 INSERT
POST 인덱스 업데이트, 데이터 조회 UPDATE, SELECT
DELETE 데이터 삭제 DELETE
HEAD 인덱스의 정보 확인  

 

4. 엘라스틱서치의 구성 요소 

엘라스틱서치는 기본적으로 분산 시스템이다. 생소한 용어가 많이 사용되니 하나씩 알아보자.

엘라스틱 서치를 구성하는 주요 구성요소로는 크게 인덱스, 샤드, 타입, 문서, 필드, 매핑 등이 있다. 

 

- 인덱스 

데이터의 저장공간이다. 엘라스틱서치를 분산 환경으로 구성하면 하나의 인덱스가 여러 노드에 분산 저장되어 관리된다. 

인덱스의 이름은 모두 소문자여야하고 추가, 수정, 삭제, 검색은 Restful API로 수행할 수 있다. 

 

- 샤드

색인된 문서는 하나의 인덱스에 담긴다. 인덱스 내부에 색인된 데이터는 물리적인 공간에 여러 개의 파티션으로 나뉘어 구성되는데, 이 파티션을 엘라스틱 서치에서는 샤드라고 부른다. 

 

- 타입 

인덱스의 논리적 구조를 의미한다. 6.0 이전 버전에서는 특정 카테고리를 분류하는 목적으로 타입이 많이 사용되었지만, 현재는 타입 사용을 권장하지 않기 때문에 장르별로 별도의 인덱스를 가각 생성해서 사용해야한다. 

 

- 문서 

엘라스틱서치에서 데이터가 저장되는 최소 단위이다. 기본적으로 JSON 포맷으로 데이터가 저장된다. (데이터베이스에서 테이블의 행과 유사하다. ) 하나의 문서는 다수의 필드로 구성되어 있는데 각 필드는 데이터의 형태에 따라 용도에 맞는 타입을 정의해야한다. 

 

- 필드 

문서를 구성하기 위한 속성이다. (데이터베이스에서 칼럼과 비교할 수 있으나 더 동적인 데이터 타입으로 볼 수 있다. )

중요한 것은 하나의 필드가 다수의 데이터 타입을 가질 수 있다는 것이다. 만약 영화 정보를 담아둔 문서에 제목 필드가 있다면, 영화 제목을 검색할 때 매칭 검색을 하거나 초성을 이용한 검색이 모두 지원되도록 제목 필드는 2개의 타입을 가져야한다. 

 

- 매핑

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

 

여기까지 Elastic search의 기본적인 것들에 대해 알아보았다.  잘 숙지 후 활용하도록 하자.