본문 바로가기
카테고리 없음

엘라스틱 서치

by 흰색남자 2022. 8. 20.

출처 & 참고

https://12bme.tistory.com/589

 

[엘라스틱서치] 실무 가이드(1) - 검색 시스템

검색 엔진(search engine)은 웹에서 정보를 수집해 검색 결과를 제공하는 프로그램이다. 검색엔진은 검색 결과로 제공되는 데이터의 특성에 따라 구현 형태가 각각 달라진다. 검색 시스템(search system

12bme.tistory.com

 

 

 

엘라스틱서치의 장점
오픈소스 검색엔진
엘라스틱서치는 아파치 루씬(Lucene)을 기반으로 개발된 오픈소스 검색엔진이다. 전 세계에서 수많은 사람들이 사용하고 있으며, 버그가 발생할 경우에도 대부분 빠르게 해결된다.

-- 역색인을 사용함

 

 
전문 검색
대부분의 데이터베이스는 기본 쿼리 및 색인 구조의 한계로 인해 기본적인 텍스트 검색 기능만 제공한다. 하지만 엘라스틱서치는 좀더 고차원적인 전문 검색(Full Text)이 가능하다. 전문 검색이란 내용 전체를 색인해서 특정 단어가 포함된 문서를 검색하는 것을 말한다. 기존 관계형 데이터베이스는 전문 검색에 적합하지 않지만 엘라스틱서치는 다양한 기능별, 언어별 플러그인을 조합해 빠르게 검색할 수 있다.
 
통계 분석
비정형 로그 데이터를 수집하고 한곳에 모아 통계 분석을 할 수 있다. 엘라스틱서치와 키바나(Kibana)를 연결하면 실시간으로 쌓이는 로그를 시각화하고 분석할 수 있다.
 
스키마리스(Schemaless)
데이터베이스는 스키마라는 구조에 따라 데이터를 적합한 형태로 변경하고 저장하고 관리한다. 반면 엘라스틱서치는 정형화되지 않은 다양한 형태의 문서도 자동으로 색인하고 검색할 수 있다.
 
RESTful API
엘라스틱서치는 HTTP 기반의 RESTful API를 지원하고 요청뿐 아니라 응답에도 JSON 형식을 사용해 개발 언어, 운영체제, 시스템에 관계없이 이기종 플랫폼에서도 이용 가능하다.
 
멀티테넌시(Multi-tenancy)
서로 상이한 인덱스일지라도 검색할 필드명만 같으면 여러개의 인덱스를 한번에 조회할 수 있다. 이를 이용해 멀티테넌시 기능을 제공할 수 있다.
 
Document-Oriented
여러 계층의 데이터를 JSON 형식의 구조화된 문서로 인덱스에 저장할 수 있다. 계층 구조로 문서도 한 번의 쿼리로 쉽게 조회할 수 있다.
 
역색인(Inverted Index)
엘라스틱서치는 루씬 기반의 검색엔진으로 역색인을 지원한다.
 
확장성과 가용성
엘라스틱서치는 분산 구성으로 대량의 문서를 좀더 효율적으로 처리할 수 있다. 분산 환경에서 데이터는 샤드(Shard)라는 작은 단위로 나뉘어 제공되며, 인덱스를 만들때마다 샤드의 수를 조절할 수 있다. 이를 통해 데이터의 종류와 성격에 따라 데이터를 분산해서 빠르게 처리할 수 있다.

 

엘라스틱서치는 업데이트 명령이 요청될 경우 기존 문서를 삭제하고 변경된 내용으로 새로운 문서를 생성하는 방식을 사용한다. 이러한 이유로 단순 업데이트에 비해서는 상대적으로 많은 비용이 발생한다. 

 

 

 

용어 정리

인덱스

인덱스(Index)는 데이터 저장 공간이다. 하나의 인덱스는 하나의 타입만 가지며 하나의 물리적인 노드에 여러 개의 논리적인 인덱스를 생성할 수 있다. 검색 시 인덱스 이름으로 문서 데이터를 검색하며, 여러 개의 인덱스를 동시에 검색하는 것도 가능하다. 

 

엘라스틱서치를 분산환경으로 구성하면 하나의 인덱스가 여러 노드에 분산 저장되어 관리된다. 따라서 분산 처리에 따른 여러 이점을 누릴 수 있다. 엘라스틱서치는 인덱스 생성시 기본적으로 5개의 프라이머리(Primary) 샤드와 1개의 레플리카(Replica) 샤드 세트를 생성한다. 각각의 샤드 수는 인덱스를 생성할때 옵션을 이용해 변경할 수 있다.

 

인덱스의 이름은 모두 소문자여야 하며 추가, 수정, 삭제, 검색은 RESTful API로 수행할 수 있다. 만약 인덱스가 없는 상태에서 데이터가 추가된다면 데이터를 이용해 인덱스가 자동으로 생성된다.

 

샤드

색인된 문서는 하나의 인덱스에 담긴다. 인덱스 내부에 색인된 데이터는 물리적인 공간에 여러 개의 파티션으로 나뉘어 구성되는데, 이 파티션을 엘라스틱서치에서는 샤드(Shard)라고 부른다. 엘라스틱서치는 다수의 샤드로 문서를 분산 저장하고 있어 데이터 손실 위험을 최소화할 수 있다.

 

타입

타입(Type)은 인덱스의 논리적 구조를 의미하며, 인덱스 속성에 따라 분류하기도 한다. 엘라스틱서치 6.0 버전 이하에서는 하나의 인덱스에 여러 타입 설정이 가능했지만 6.1 버전부터는 인덱스당 하나의 타입만 사용할 수 있다.

 

엘라스틱서치 6.0 이하 버전에서는 특정 카테고리를 분류하는 목적으로 타입이 많이 사용됐다. 예를 들어 music이라는 인덱스가 존재한다면 장르별(Rock, K-pop, Classic)로 분리해 사용했다. 하지만 현재는 타입을 사용하는 것을 권장하지 않기 때문에 장르별로 별도의 인덱스를 각각 생성해서 사용해야 한다.

 

문서

문서(Document)는 엘라스틱서치에서 데이터가 저장되는 최소 단위다. 기본적으로 JSON 포맷으로 데이터가 저장된다. 데이터베이스와 비교하자면 테이블의 행이 엘라스틱서치의 문서에 해당한다고 볼수 있다. 하나의 문서는 다수의 필드로 구성돼 있는데 각 필드는 데이터의 형태에 따라 용도에 맞는 데이터 타입(Data Type)을 정의해야 한다. 또한 문서는 중첩 구조를 지원하지 하기 때문에 이를 이용해 문서 안에 문서를 지정하는 것도 가능하다.

 

필드

필드(Field)는 문서를 구성하기 위한 속성이라고 할 수 있다. 일반적으로 데이터베이스의 칼럼(Column)과 비교할 수 있으나 컬럼이 정적(static)인 데이터 타입인 데 반해 필드는 좀 더 동적(dynamic)인 데이터 타입이라고 할 수 있다.

 

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

 

매핑

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

 

 

 

색인(Index)란?

문서에서 키워드를 찾아보기 쉽도록 정렬/나열한 목록을 말합니다.

일반적으로 책 뒷편에 색인, 인덱스, 찾아보기와 같은 이름으로 정돈된 목록을 말합니다.

역색인(Inverted Index)란?

키워드를 통해 문서를 찾아내는 방식을 말합니다.

책 뒷편의 색인된 키워드를 이용해 역으로 본문(혹은 문서)을 찾는 방식을 말합니다.

 

 

Inverted Index & 형태소 분석

역색인과 형태소 분석은 검색엔진의 핵심 기능으로 키워드(Term)을 기반으로 빠르게 원하는 문서를 탐색하기 위해 활용된다.

일반적인 데이터베이스에서는 단방향 색인을 사용한다. 따라서, 특정 키워드를 포함하고 있는 문서를 찾기 위해서는 모든 문서의 내용을 읽어서 키워드의 포함 여부에 대한 검사가 이루어져야 한다. 이러한 과정은 상당한 연산을 수반하며, 별도의 캐싱 로직을 추가하지 않는 이상 동일한 요청에 대해서도 같은 작업이 반복되어 이뤄지게 된다.

역색인(Inverted Index)은 이러한 문제를 해결하기 위해 만들어진 색인 구조이다. 역색인은 특정 키워드(Term)로 포함하고 있는 문서들에 대한 Primary Key를 맵핑하는 인덱스 테이블을 생성하며, 이 테이블을 활용하여 빠른 문서 탐색을 가능케 한다. 검색엔진에서 역색인 인덱스 테이블은 주로 BTree, Trie, Hash Table 등의 자료구조를 활용하여 구현된다.

 

 

 

엘라스틱서치에서 검색엔진을 만드는 방법.

키워드 타입은 그 자체로 검색을 하는 반면, 텍스트 타입은 분석기를 적용해야한다.
"analyzer" : "<애널라이저명>" - 색인에 사용할 애널라이저를 입력하며 디폴트로는 standard 애널라이저를 사용합니다. 토크나이저, 토큰필터들을 따로 지정할수가 없으며 필요하다면 사용자 정의 애널라이저를 settings에 정의 해 두고 사용합니다.