DBMS/ElasticSearch

ElasticSearch란 무엇인가요?

블로그 주인장 2024. 2. 6.

ElasticSearch란?

ElasticSearch는 Apache Lucene 기반의 Java 오픈소스 분산 검색 엔진입니다.

검색 엔진이라고 부르고, 역색인의 구조를 가지고 있기 때문에 검색 속도가 매우 빠르다.

 

흔히, ElasticSearch를 검색엔진이라고 부르지만, 

NoSQL의 형식으로 데이터를 저장하기에 NoSQL 데이터베이스처럼 사용하기도 한다.

 

NoSQL

ElasticSearch는 모든 데이터를 JSON의 도큐먼트 형식으로 입력 및 관리가 되고 있다.

또한, 쿼리한 결과에 일치하는 원본을 반환하며

문자, 숫자, 날짜, IP 주소 등 다양한 타입을 사용할 수 있다.

 

그리고 RDBMS(관계형 데이터베이스) 와는 비교도 안될 만큼

빠른 속도로 데이터를 조회할 수 있고 복잡한 검색이 가능하다. 

 

역색인(Inverted Index)

색인의 경우 한 개의 컬럼에 책갈피를 꽂아주는 느낌이라면,

역색인은 보통 서적의 제일 뒷 페이지라고 볼 수 있다.

 

보통 책의 뒷 페이지를 보면 특정 용어가 언급된 모든 페이지를 알려주는 페이지가 존재한다.

바로 해당 페이지의 역할을 하는 게 역색인(Inverted Index)라고 보면 된다.

 

즉, 역색인은 특정 단어가 어느 문서에 있는지 기록하기 때문에

특정 단어를 검색할 때 모든 문서를 훑지 않고 검색하여 찾을 수 있습니다.

 

 

분석기

ElasticSearch에 인덱싱이 이루어지는 경우 분석기라는 것을 통하여

용어(Term)가 분해되어 역인덱스 사전이 구축된다.

 

이를 통해 엄청나게 빠른 속도로 전문 검색을 지원하게 된다.

 

SQL의 Like 구문이 전문검색 이라고 이야기를 하지만, 완벽한 전문 검색을 지원하지 않는다.

하지만 ElasticSearch는 분석기를 통한 역인덱싱으로 이를 완벽하게 구현한다.

 

 

 

ElasticSearch는 전문 검색을 위하여 3가지로 구성되어 있는 분석기 모듈이 존재한다.

 

💡 전문 검색이란?

  • 긴 장문의 문자열 속에서 일부를 검색해도 나오는 것을 말한다.

 

여기에서 주의할 점은 토큰과 용어의 차이가 존재한다는 것이다.

 

토큰은 분석기에서 토크나이저를 통해 필터링 된 문자열이 잘리는데,

이 때 잘린 단위를 토큰이라고 지칭한다.

토큰 필터를 거쳐서 최종적으로 정제가 되어 인덱스에 저장되는 토큰들을 용어라고 부른다.

 

이렇게 문자를 잘라서 인덱싱하는 것을 역인덱스(역색인)이라고 부른다.

 

분석기 종류

캐릭터 필터

  • 입력받은 문자열을 변경하거나, 불필요한 문자를 제거한다.
  • HTML 태그 같은 것을 처리하거나, 특정 단어를 다른 단어로 변경할 수 있다.

토크나이저

  • 문자열을 토큰으로 분리한다.
  • 기본값의 경우에는 공백을 기준으로 토큰화가 진행된다.

토큰 필터

  • 분리된 토큰의 필터 작업을 진행한다.
  • 소문자, 대문자로 변경하거나 형태소 분석과 같은 작업이 이루어진다.

 

위와 같이 3개의 모듈을 통해서 역인덱싱이 적용되는데,

분석기 자체의 옵션을 지정하는 방법과

각각 모듈에 옵션을 지정하는 방법,

원하는 옵션이 없을 경우 직접 지정하는 커스텀 분석기가 존재한다.

 

대표적인 사용 예시

주로 사용하는 분석기

분석기 이름 설명
standard 옵션을 적용하지 않을 경우 기본적으로 사용하는 분석기
영어를 기준으로 스탠다드 토크나이저와 소문자 변경필터, 스톱 필터가 포함되어있다.
simple 문자만 토큰화한다.
공백, 숫자, 하이픈(-), 따옴표(') 같은 문자는 토큰화하지 않는다.
stop simple 분석기와 비슷하지만 스톱 필터가 포함되어 있다.

 

대표적인 캐릭터 필터

필터 이름 설명
html_strip HTML 태그를 제거하여 일반 텍스트로 만든다
mapping 지정한 단어를 다른 단어로 변경한다.
특수문자를 포함한 검색에서 보통 사용한다.
pattern_replace 정규식을 사용하여 더욱 더 복잡한 패턴을 변경할 수 있도록 만든다.

 

대표적인 토크나이저

토크나이저 이름 설명
standard 스탠다드 분석기가 사용하는 토크나이저이다.
쉼표, 점, 특수문자 등을 제거하여 토큰화를 시킨다.
특징으로는, 중간에 있는 것은 지우지 않는다.
Leetter 알파벳을 제외한 모든 것을 제거한 후 토큰화를 시킨다.
whitespace 공백을 기준으로 구분하여 토큰화를 한다.
ngram 원문으로부터 N개의 연속된 글자 단위를 모두 토큰화 시킨다.
예로 "양념치킨"을 토큰화 시킬 경우 [양념,념치,치킨] 이런식으로 분리가 된다.

전문 검색이 가능하지만 ngram의 수보다 적은 글자일 경우에는
검색이 불가능하고, 문장이 길어지면 조합이 많아지기에 저장공간을 많이 차지하는 문제가 발생한다.
uaz_url_email 스탠다드 분석기와 비슷하지만, url과 이메일을 토큰화시켜준다.

 

대표적인 토큰 필터

토큰 필터 이름 설명
lowercase 모든 문자를 소문자로 변환한 후 term으로 만든다.
uppercase 모든 분자를 대문자로 변환한 후 term으로 만든다.
stop 모든 불용어를 제거한다.
불용어 : 한국어에는 존재하지 않는 영어의 'a', 'the' 를 의미한다.
stemmer 문자의 형태를 분석해 어간으로 변화시킨다.
기본적으로 영어를 지원한다.

 

기본적으로 영어를 기반으로 제작이 되었기 때문에

한글 형태소 분석기를 활용하고 싶은 경우에는 직접 구현해야 한다.

 

해당 기능도 추가적으로 제작이 되었다.

https://wonyong-jang.github.io/elk/2021/06/19/ELK-Elastic-Search-analyze-korean2.html

 

 

 

또한 직접 제작하는 방법도 있는데 이를, Custom Analyzer라고 부른다.

https://www.elastic.co/guide/en/elasticsearch/reference/7.17/analysis-custom-analyzer.html

 

ElasticSearch의 특징

분산형 구조

  • 여러 대의 서버에 데이터를 분산 저장하고, 검색 요청을 분산 처리한다.
  • 서버가 추가되거나 삭제되어도 클러스터를 중단시키지 않고 계속 운영이 가능하다.

Restful API

  • HTTP 프로토콜을 사용하여 데이터를 색인하고 검색을 할 수 있다.
RDMS CRUD ElasticSearch RestFul
Create PUT
Read GET
Update POST
Delete DELETE

 

 

RDMS vs ElasticSearch

 

인덱스

인덱스는 도큐먼트를 저장하는 논리적 단위로,

관계형데이터베이스의 DataBase와 비슷한 개념이다.

@Getter
@Document(indexName = "tag")
public class TagSearch {
  @Id
  @Field(type = FieldType.Long, name = "tag_id")
  private Long id;

  @Field(type = FieldType.Text, name = "tag_name")
  private String name;
}

 

위의 예시 코드를 보면 indexName은 tag 라는 DB 이름을 가진 인덱스에

도큐먼트를 생성한 것으로 확인할 수 있다.

 

도큐먼트

도큐먼트는 관계형 데이터베이스의 row(레코드)와 동일한 의미라고 할 수 있다.

 

모든 도큐먼트는 1개의 인덱스를 가지고 있어야 하고,

인덱스에서 정한 스키마가 모든 도큐먼트의 스키마를 결정한다.

 

관계형 데이터베이스처럼 형식에 따라서 분리를 하여 사용하는 것이 일반적이다.

 

필드와 매핑

필드는 관계형 데이터베이스의 Column(컬럼)과 동일한 의미라고 할 수 있다.

 

여기서 중요한 것이 매핑(Mapping)인데 해당하는 필드의 타입을 지정해주는 것을 의미한다.

 

관계형 DB의 경우 테이블을 만들 때, 반드시 스키마 설계가 우선적으로 필요하다.

하지만 NoSQL에서는 타입 구분 없이 넣을 수 있지만, 문제가 발생할 수 있기 때문에 스키마 설계를 권장한다.

 

ElasticSearch에서는 들어오는 타입에 따라서 자체적으로 스키마를 매핑해주는 다이나믹 매핑이 존재한다.

하지만, 자신이 직접 설정하는 명시적 매핑을 권장한다.

 

다이나믹 매핑

모든 인덱스는 매핑 정보를 갖고 있지만, 유연한 활용을 위해 매핑 정의를 강제하지 않는다.

하지만 분석기를 설정하지 않은 경우, 자체적으로 스탠다드 분석기가 적용되는 것처럼

아무런 설정을 하지 않을 경우 들어온 값에 따라서 자체적으로 매핑이 적용되는 것을 뜻한다.

 

기본적인 형태는 JSON 도큐먼트의 데이터 타입에 맞춰서 인덱스 매핑을 해주기에

데이터의 형태만 고민하면 되서 상대적으로 편하지만,

특정 타입에 대해서는 메모리 낭비 혹은 검색이 불가능할 수도 있기 때문에 매핑이 필요하다.

원본 소스 데이터 타입 다이나믹 매핑으로 변환된 데이터 타입
null 필드에 추가하지 않음
boolean boolean
float float
integer long
object object
string string 형태에 따라서 date or text/keyword 필드

 

명시적 매핑

인덱스 매핑을 직접 정의하는 것을 의미한다.

인덱스가 생성되기 전에 매핑 설정을 하거나 API를 통하여 지정할 수 있다.

 

아래의 내용은 Field Type에 관한 공식 문서 내용입니다.

https://www.elastic.co/guide/en/elasticsearch/reference/7.17/mapping-types.html

 

명시적 매핑을 해야하는 이유

1. 정수가 입력될 경우 모든 데이터 타입이 Long으로 지정된다.

  • Long 타입은 엄청 큰 정수 타입인데 사람의 나이, 게시글의 좋아요 개수 등의 서비스에 따라서 큰 수가 필요가 없다.
    이는 메모리 낭비로 이어지기 때문에 short나 Integer를 사용하는 것이 좋다.

2. 전문 검색이 필요한 경우와 필요하지 않은 경우를 나눠야한다.

  • 텍스트를 지정하는 타입 중에는 text와 keyword라는 2가지의 타입이 존재한다.
  • text : 전문 검색이 필요할 때 사용하는 타입, 분석기가 텍스트를 분리한다.
  • keyword : 전문 검색이 필요 없을 때 사용하는 타입으로 원문 그대로 인덱싱한다.
  • keyword에는 최대 저장할 수 있는 길이가 존재한다.
    위의 주의 사항을 고려하지 않고 저장할 경우 데이터가 정상적으로 인덱싱 되지 않을 수 있다.

3. 다양한 타입이 한 번에 필요한 경우 지정할 수 있다.

  • 데이터 형식에 따라서 전문 검색도 해야하지만 정렬 옵션이 필요한 경우가 있다.
  • 이를 대비하여 한 개의 필드에 다양한 타입을 지정할 수 있는 멀티필드를 지원한다.

 

로그스태시

로그스태시(LogStash)는 특정 데이터를 입력받아,

데이터를 가공한 후에 ElasticSearch에 데이터를 집어넣어 줄 수 있는 파이프라인이다.

 

로그스태시는 플러그인 기반의 오픈소스 데이터 처리 파이프라인 도구로써,

다소 복잡하고 귀찮은 데이터 전처리 과정을 간단한 설정으로 수행할 수 있게 만들어준다.

 

그래서 일반적으로 엘라스틱 서치를 사용할 때 별도의 프로그램을 사용하는 것보다

로그스태시를 사용하는 것을 추천한다.

 

로그 스태시의 특징

1. 플러그인 기반 시스템

  • 파이프라인을 구성하는 모든 요소가 전부 플러그인 형태로 만들어져있다.
  • 기본적으로 제공하는 것 이외에도 수많은 커뮤니티에 플러그인이 존재한다.
  • 필요한 경우에는 간단한 코드로 직접 구현도 가능하다.

2. 모든 형태의 데이터 처리

  • 기본적으로 제공되는 플러그인을 사용하는 것만으로도 대부분의 데이터를 사용할 수 있다.
  • JSON, XML은 물론이고 관계형 데이터베이스나 NoSQL의 데이터를 받아서 마이그레이션하는 것도 가능하다.
  • 또한, 스케쥴러인 크론탭을 사용하여 시간에 따라 발생하는 데이터를 처리하는 것이 최적화되어있다.

3. 성능

  • 자체적으로 내장되어있는 메모리와 파일 기반의 큐를 사용하여 처리속도와 안전성이 높다.
  • 인덱싱할 도큐먼트의 수와 용량을 종합적으로 고려하여 벌크 인덱싱을 수행한다.
  • 자체적으로 파이프라인의 배치 크기를 조정하여 병목현상을 방지하여 성능을 최적화시킨다.

4. 안정성

  • ElasticSearch의 장애 상황을 대응하기 위해 재시도 로직이나 오류가 발생한 도큐먼트를 따로 보관하는 공간이 존재한다.

5. 멀티 파이프라인 지원

  • 여러 데이터를 받아야하는 경우 여러 개의 파이프라인을 연결할 수 있는 시스템이 존재한다.

 

키바나

키바나(Kibana)는 ElasticSearch에서 가공된 데이터를 직관적으로 시각화시켜주는 시각화 툴이다.

 

키바나는 대표적으로 3가지의 기능을 가지고 있다.

1. 데이터 분석 및 시각화

2. 엘라스틱 관리

3. 엘라스틱 중앙 허브

 

 

ElasticSearch 단점

1. 관계형 데이터베이스에 데이터를 받아올 경우 비정규화 과정이 필요하다

  • 엘라스틱서치는 조인(Join)을 허용하지 않기 때문에 Concat 등을 이용하여 비정규화를 해야한다.

2. 데이터를 저장하는 것이 실시간이 아니다.

  • 일반적인 경우에는 실시간처럼 보이긴 하지만, 1~2초 가량의 딜레이가 필요하다.

3. 데이터의 업데이트를 제공하지 않는다.

  • 업데이트가 되는 것처럼 보이지만, 실제로는 기존의 도큐먼트를 삭제하고 변경된 것을 생성하는 방식이다.
  • 이러한 이유로 인해 수정이 많이 필요한 데이터의 경우 ElasticSearch 사용하는 것을 권하지 않는다.

4. 트랜잭션 / 롤백 기능이 제공되지 않는다.

  • 검색엔진의 성능을 위하여 사용하기 때문에, 메인 DB로 사용하는 것은 위험하다라는 것을 뜻한다.

 

 

References

https://www.elastic.co/guide/en/elasticsearch/reference/current/index.html

https://danidani-de.tistory.com/48

https://esbook.kimjmin.net/

https://velog.io/@yukina1418/%EA%B2%80%EC%83%89%EC%97%94%EC%A7%84-Elasticsearch%EC%97%90-%EB%8C%80%ED%95%98%EC%97%AC

 

 

 

본 포스트는 작성자가 공부한 내용을 바탕으로 작성한 글입니다.
잘못된 내용이 있을 시 언제든 댓글로 피드백 부탁드리겠습니다.
항상 정확한 내용을 포스팅하도록 노력하겠습니다.

반응형

'DBMS > ElasticSearch' 카테고리의 다른 글

ElasticSearch를 이용한 검색 최적화(with. SpringBoot)  (1) 2024.03.27

댓글