시뻘건 개발 도전기

검색 시스템 이해하기 본문

Reading/엘라스틱서치 실무 가이드

검색 시스템 이해하기

시뻘건볼때기 2023. 12. 1. 01:11
반응형

엘라스틱 서치

검색엔진은 웹에서 정보를 수집해 검색 결과를 제공하는 프로그램이다. 검색 결과로 제공되는 데이터의 특성에 따라 구현 형태가 달라진다. 검색 시스템은 대용량 데이터의 검색 결과를 제공하기 위해 검색엔진을 기반으로 구축된 시스템이다. 수집기를 이용해 데이터를 수집하고 이를 다수의 검색엔진을 이용해 색인하여 UI로 검색 결과를 제공한다. 엘라스틱서치는 이와 같은 검색엔진이며 이를 사용하여 검색 시스템을 구축할 수 있다.

 

검색 시스템

검색 시스템의 구성 요소

[그림 1] 검색 시스템의 구성

 

검색 시스템은 데이터를 수집하는 수집기, 데이터를 저장하는 스토리지, 데이터를 검색에 적절한 형태로 변환하는 색인기, 색인된 데이터에서 일치하는 문서를 찾는 검색기로 구성된다.

수집기

수집기는 웹에서 필요한 정보를 수집하는 프로그램이다. 웹상의 대부분의 정보가 수집 대상이 된다.

스토리지

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

색인기

수집된 데이터를 검색가능한 구조로 가공하고 저장한다. 다양한 형태소 분석기를 조합해 정보에서 의미가 있는 용어를 추출하고 검색에 유리한 연색인 구조로 데이터를 저장한다.

검색기

검색기는 사용자 질의를 입력받아 색인기에서 저장한 연색인 구조에서 검색순위 알고리즘으로 판단하여 일치하는 문서를 찾아 결과로 반환한다. 사용하는 형태소 분석기에 따라 검색 품질이 달라진다.

 

RDB와의 차이점

[그림 2] RDB와 ES의 비교

데이터베이스는 데이터를 통합 관리하는 데이터의 집합이다. 텍스트 매칭을 통한 단순 검색만 가능하다. 텍스트를 여러 단어로 변형하거나 여러 개의 동의어나 유의어를 활용한 검색이 불가능하다. 하지만 검색엔진은 비정형 데이터를 색인하고 검색할 수 있다. 형태소 분석을 통해 사람이 구사하는 자연어의 처리가 가능해지고 역색인 구조를 바탕으로 빠른 검색 속도를 보장한다. ES는 기본적으로 http를 통해 json형식의 RESTful API를 이용한다. ES는 자바로 개발되었지만 여러 언어를 통해 활용할 수 있다.

[그림 3] CRUD 비교

ES를 사용하기 위한 간단한 api 요청 구조는 아래와 같다.

curl -X(메서드) http://host:port/ (인덱스)/(타입)/(문서 id) -d '{json 데이터}'

 

[그림 4] 사용자 정보 데이터 예시

[그림 4]와 같이 데이터가 있다고 가정해보자. "가마돈"이라는 사용자의 데이터를 조회할 때 검색엔진이 제공하는 search api를 사용한다면 아래와 같이 사용할 수 있다.

GET http://localhost:9200/user/_search?q=Name: 가마돈

{
    "ID": 1,
     "Name" : "가마돈",
    "Location": "서울",
    "Gender": "남",
    "Date": "2018-05-12"
}

ES는 RDB보다 더 유연하다. 연색인되는 문자열 전체를 정책에 따라 소문자 혹은 대문자로 생성하고 쿼리가 들어오는 필터를 색인 시간과 검색 시간에 동일하게 지정한다면 대소문자 구분 없이 검색이 가능해진다. 또한 구조화 되지 않은 비정형 데이터 검색이 가능하다. DB는  스키마를 미리 정의해야 CRUD가 가능한 반면 ES는 구조화 되지 않은 데이터까지 스스로 분석해 자동으로 필드를 생성하고 저장한다.

 

엘라스틱서치의 강점

 

오픈소스 검색엔진

ES는 오픈소스이기 때문에 많은 사용자와 그에 따른 방대한 정보로 버그가 발생할 경우 빠르게 해결할 수 있다.

전문 검색

ES는 고차원적인 전문 검색(Full Text)가 가능하다. (사실 MySQL에서도 Full Text를 지원하게 되었는데... queryDSL을 사용하면 이를 사용할 수 있다... 그렇다면 RDB에서의 Full Text와 ES에서의 Full Text의 차이는...?) 전문 검색이란 내용 전체를 색인해서 특정 단어가 포함된 문서를 검색하는 것을 말한다.

통계 분석

비정형 로그 데이터를 수집하고 한 곳에 모아 통계 분석을 할 수 있다. 대표적으로 ES와 키바나를 연결하면 실시간 오류 혹은 로그 등 데이터를 시각화하고 분석이 가능하다.

스키마리스

ES는 정형화되지 않은 다양한 형태의 문서를 자동으로 색인하고 검색한다.

RESTful API

http 기반의 RESTful API를 지원하고 응답으로 json 형식을 사용해 이기종 플랫폼에서도 이용이 가능하다.

멀티테넌시

서로 상이한 인덱스일지라도 검색할 필드명만 같으면 여러 개의 인덱스를 한 번에 조회할 수 있다. 이를 이용해 멀티테넌시 기능을 제공할 수 있다.

Document-Oriented

여러 계층의 데이터를 json 형식의 구조화된 문서로 인덱스에 저장할 수 있다. 계층 구조로 문서도 한 번의 쿼리로 쉽게 조회할 수 있다.

역색인

책의 마지막 페이지에 제공되는 색인 페이지와 비슷한 특수한 데이터 구조다. "검색엔진"이란 단어가 포함된 모든 문서를 찾아야한다고할 때 단어가 포함된 모든 문서의 위치를 알 수 있다.

[그림 5] 연색인된 단어와 문서 번호와의 관계 예시

확장성과 가용성

분산 환경에서 데이터는 샤드라는 단위로 나누어 제공되며 인덱스를 만들 때마다 샤드의 수를 조절할 수 있다. 이를 통해 데이터의 종류와 성격에 따라 데이터를 분산해서 빠르게 처리할 수 있다.

 

엘라스틱서치의 약점

실시간

ES는 실시간이 아니다. 색인된 데이터는 통상적으로 1초 뒤에나 검색이 가능하다. 색인된 데이터는 내부적으로 commit과 flush같은 복잡한 과정을 거치기 때문에 실시간이 될 수 없다. (준 실시간 이라고 하더랍니다..ㅎㅎ)

트랜잭션

transaction과 rollback 기능을 제공하지 않는다. ES는 분산 시스템으로 구성된다. 클러스터의 성능 향상을 위해 롤백과 트랜잭션과 같은 비용소모가 큰 기능은 지원하지 않는다. 따라서 데이터 손실의 위험이 있다.

업데이트

데이터의 업데이트 기능을 제공하지 않는다. ES는 업데이트 명령이 요청될 경우 기존 문서를 삭제하고 변경된 내용으로 새로운 문서를 생성하는 방식을 사용한다. 따라서 상대적으로 많은 비용이 발생한다. (뒤에서 불변적이라는 이점을 취할 수 있다는 내용이 나온다고하더랍니다.)

 

반응형

'Reading > 엘라스틱서치 실무 가이드' 카테고리의 다른 글

데이터 모델링: 맵핑 api  (2) 2023.12.05
엘라스틱서치 api  (1) 2023.12.04
엘라스틱서치 용어  (1) 2023.12.01
키바나 설치  (0) 2023.12.01
Elasticsearch 환경 구축  (2) 2023.12.01
Comments