프로젝트/개인 프로젝트(2023.11.13-2023.12.18)

[개인프로젝트] ElasitcSearch 에 대해 좀 더 공부해보자 (2)

dal_been 2024. 3. 11. 12:32
728x90

저번 블로그에서는 ElasticSearch 개념에 대해 알아보았고 이번에는 과정에 대해 알아볼 예정이다

 

 


색인과정

 

색인이란 문서를 분석하고 저장하는 과정이다.

 

색인과정을 간단하게 설명하자면

인덱스의 존재 유무 파악 -> 있다면 매핑정보 있는가(없다면 동적매핑) -> 매핑정보 올바른지 확인(안올바르면 에러)

-> inverted index 생성 -> 프라미머리 샤드에 저장 -> 레프리카 샤드에 복사

 

1. 색인 과정

 

어떤 노드에 요청을 해도 동일한 응답을 보장하지만 여기서는 레플리카가 존재하는 노드에 요청했다고 가정하면

첫번째 노드(데이터노드)로 전달하여 프리미어 샤드에 저장되고 레플리카 노드로 다시 들어온다.

 

저 이미지 상황에는 문제가 있다.

1. 하나의 노드가 놀고 있다

2. 프라이머리 샤드가 노드하나에만 존재하여 색인이 한곳에서만 일어난다

3. 즉 색인에 있어서 1대의 노드(데이터 노드)만 있다고 할 수 있다.

 

따라서 클러스터 성능향상을 위해 노드를 증설하였지만 그 안의 샤드의 개수도 적절하게 설정하는 것이 중요하다.

뿐만 아니라 샤드의 개수를 증설한다고 해서 노드에 고르게 분배하지 않으면 용량 불균형이 일어날 수 있다.

(노드 1에는 샤드가 1개 10GB이고, 노드 2에는 샤드가 2개라 20GB와 같은 불균형)

 

 

 

Inverted Index

 

문자열을 분석한 결과를 저장하고 있는 구조체라고 한다.

 

 

Analyzer

 

문자열을 분석해서 Inverted Index 구성을 위한 토큰을 만들어 내는 과정을 말한다.

 

각각 역할에 예시를 들어보자면 

charater filter에서는 특수문자 제거와 같은 일을 한다.

tokenizer에서는 공백 기준으로 나누는 거와 같은 일을 한다.

token filter에서는 대소문자를 소문자로 통일하는 일을 한다.

 

 

검색 과정

 

검색 요청은 프라이머리 샤드나 레플라카 샤드 모두 처리 가능하다.

 

이렇게 구성되어있다면 두대의 노드에서만 검색 요청이 이루어지기 때문에 비효율적이다.

그러니 프라이머리 샤드는 초기 세팅시 바꾸기 어렵기 때문에 일단 놀고 있는 노드에 레플리카 샤드를 늘려서 검색 요청 더 처리할 수 있도록 해준다.

 

 

text vs keyword

 

둘다 문자열을 나타내느 타입이지만 토큰이 생성되는 방식??이 다르다.

 

예를 들어 "I am student" 문자해서 

text의 경우 -> I / am / student 와 같이 토큰이 생성되지만

keyword 의 경우 ->  I am student 로 토큰이 생성된다

 

그랫서 keyword의 경우 공백 기준 쪼개는것과같은 작업이 없어서 색인속도가 더 빠르다.

동적 매핑으로 스케마를 정의할 경우 문자열 필드는 text와 keyword타입 두개가 모두 생성된다.

 

따라서 문자열 특성에 따라 text, keyword를 정해주는 것이 좋다.

토크나이징이 필요하지 않는 경우 keyword로 하는 것이 색인 성능에 도움이 된다.

 


최근 ElasticSearch 관련해서 유튜브에 어떤 대기업이 사용한 예시가 있던데 그거 보고 한번 정리해볼 예정이다.

 

 

https://www.inflearn.com/course/elasticsearch-essential/dashboard