-
ElasticSearch - 검색과정ElasticSearch 2024. 9. 24. 16:23반응형
ElasticSearch 검색과정

큰 흐름으로 보게된다면 위와같은 흐름이 된다. 조금 더 자세하게 살펴 보기 전 inverted index에대해 먼저 알아보자.
Inverted Index의 기본 원리
- 토큰화 (Tokenization): 먼저, 텍스트는 "단어"(토큰)로 쪼개집니다. 예를 들어, "고양이가 놀고 있다"라는 문장을 입력하면, 이를 "고양이", "놀고", "있다"와 같은 토큰으로 분리합니다.
- 역인덱스 생성: 각 단어(토큰)를 기반으로, 해당 단어가 포함된 문서나 위치를 기록합니다. 이렇게 만들어진 인덱스는, 특정 단어가 어떤 문서에 나타나는지를 쉽게 찾을 수 있도록 구조화되어 있습니다.
Inverted Index의 예시
다음과 같은 두 문서가 있다고 가정해봅시다:
- 문서 1: "고양이가 놀고 있다"
- 문서 2: "강아지가 뛰고 있다"
이 문서들을 역인덱스 방식으로 저장하면, 다음과 같은 데이터 구조가 만들어집니다:
- "고양이": [문서 1]
- "놀고": [문서 1]
- "있다": [문서 1, 문서 2]
- "강아지": [문서 2]
- "뛰고": [문서 2]
이렇게 저장된 인덱스는 특정 단어가 어느 문서에 있는지 빠르게 찾아낼 수 있습니다. 예를 들어, "있다"라는 단어를 검색하면 문서 1과 문서 2에 모두 포함되어 있음을 알 수 있습니다.
이를 쉽게 설명하자면, 일반적인 인덱스는 책의 끝에 있는 색인처럼, 특정 키워드가 어디에 있는지 찾는 데 도움을 주는 방식입니다. 반면, 역인덱스는 반대로, 각 단어가 어떤 문서에 포함되어 있는지를 빠르게 찾아주는 역할을 합니다.

- 문자열: 입력된 원본 텍스트입니다. 검색을 위해 분석해야 하는 데이터입니다.
- Character Filter (문자 필터): 여기서는 입력된 텍스트의 문자를 필터링합니다. 예를 들어, 특수 문자를 제거하거나 텍스트를 표준화하는 작업을 할 수 있습니다. 특정 패턴을 다른 것으로 대체할 수도 있습니다.
- Tokenizer (토크나이저): 문자 필터링이 끝난 후, 텍스트를 작은 단위(토큰)로 분리합니다. 이 단계에서는 일반적으로 공백이나 구두점 등을 기준으로 텍스트를 쪼갭니다. 예를 들어 "고양이가 놀고 있다"라는 문장을 "고양이", "놀고", "있다"와 같은 단어들로 나눕니다.
- Token Filter (토큰 필터): 생성된 토큰들은 추가적인 필터링 과정을 거칩니다. 이 과정에서는 토큰을 수정하거나 불필요한 토큰을 제거하거나, 혹은 새로운 토큰을 추가하는 작업이 이루어집니다. 예를 들어, 모든 토큰을 소문자로 변환하거나, 불용어(자주 사용되지만 검색에 유용하지 않은 단어)를 제거하거나, 단어의 어간을 추출하는 작업을 포함할 수 있습니다.
- Tokens (최종 토큰): 최종적으로 처리된 토큰들이 생성되며, 이 토큰들을 역인덱스를 구성하는 데 사용합니다. 이 인덱스는 엘라스틱서치가 검색을 빠르게 처리할 수 있도록 돕는 핵심 구조입니다.
애널라이저 구성 요소:
- Character Filter (문자 필터):
입력된 텍스트의 문자를 처리하고 필터링하는 단계입니다. 예를 들어, HTML 태그를 제거하거나 특수 문자를 변환하는 등의 작업이 여기에서 이루어집니다. 텍스트가 이 필터를 통과하면 원하는 형식으로 문자가 수정됩니다. - Tokenizer (토크나이저):
텍스트를 작은 단위로 나누는 역할을 합니다. 보통 공백이나 구두점 등을 기준으로 텍스트를 분리하며, 각각의 작은 단위를 토큰이라고 합니다. 이 과정은 분석을 위한 기본적인 단위로 데이터를 쪼개는 핵심 단계입니다. - Token Filter (토큰 필터):
토큰이 생성된 후, 추가적인 필터링 작업을 합니다. 여기에서는 소문자로 변환하거나, 불필요한 단어(예: 불용어)를 제거하는 작업, 또는 단어의 어간(stemming)을 추출하는 작업이 수행됩니다.
character filter, tokenizer, token filter 세가지를 합쳐 애널라이저를 구성할 수 있다.
검색어 분석의 경우는 analyazer를 적용하여서 token을 만들어내고, inverted index는 만들어진 token을 이용하여 inverted index내부에서 검색을 한다.
검색 요청은 프라이머리 샤드와 레플리카 샤드 모두가 처리 할 수 있다.
클러스터의 장점을 활용하지 못한 경우

number_of_shard = 2 및 number_of_replicas = 1로 설정된 상태를 설명합니다. 그림에서 보이는 것처럼 두 개의 **프라이머리 샤드(Primary Shard)**와 그에 대응하는 두 개의 **레플리카 샤드(Replica Shard)**가 있습니다.
- 샤드 0과 샤드 1:
- 이 샤드들은 데이터를 저장하는 기본 단위입니다. 프라이머리 샤드는 데이터의 원본을 저장하며, 레플리카 샤드는 이를 복제한 데이터를 보유합니다.
- 분산된 클러스터 구조:
- 첫 번째 노드와 세 번째 노드에는 각각 프라이머리와 레플리카 샤드가 할당되어 있지만, 두 번째 노드에는 아무런 샤드가 할당되지 않았습니다. 즉, 두 번째 노드는 검색 요청을 처리할 수 없습니다.
- 이는 클러스터의 분산 처리 장점을 제대로 활용하지 못하는 상태입니다.
요청이 들어오면 샤드들로 분배가 된다. 두번째 노드에는 샤드가 없기 때문에 아무리 많은 요청이 들어와도 처리를 하지 못하고 클러스터의 장점을 사용하지 못하게된다.
클러스터의 장점을 활용한 경우

검색 성능을 늘리기 위해 레플리카 샤드를 늘려주었습니다. number_of_replicas = 2로 설정을 변경한 후의 상태를 보여줍니다. 이에 따라 모든 노드가 샤드를 할당받게 됩니다.
- 샤드 분포:
- 이제 첫 번째, 두 번째, 세 번째 노드 모두 프라이머리 또는 레플리카 샤드를 가지고 있습니다. 이는 검색 성능을 향상시키는 중요한 요소입니다. 각 노드가 검색 요청을 처리할 수 있기 때문에, 클러스터의 모든 노드를 활용할 수 있게 됩니다.
- 검색 성능 향상:
- 엘라스틱서치에서는 검색 요청을 프라이머리 샤드와 레플리카 샤드 모두가 처리할 수 있습니다. 레플리카 샤드가 많을수록 검색 요청을 처리할 수 있는 노드가 늘어나기 때문에 검색 성능이 개선됩니다.
- 레플리카 샤드와 프라이머리 샤드:
- 프라이머리 샤드는 데이터의 원본을 저장하는 반면, 레플리카 샤드는 그 복제본을 저장합니다. 레플리카 샤드는 프라이머리 샤드에 장애가 발생했을 때 백업으로 활용될 수 있고, 또한 검색 성능을 향상시키는 데 기여합니다.
- 다이나믹한 레플리카 설정:
- 레플리카 샤드는 동적으로 변경 가능하므로, 검색 성능이 필요할 때 언제든지 레플리카 수를 늘리거나 줄일 수 있습니다. 하지만 프라이머리 샤드는 클러스터가 처음 설정될 때 정해지며, 그 이후에는 변경이 불가능합니다.
위와같이 설정된 경우 검색 요청이 온다면 모든 노드에게 요청이 가게 된다. replicas는 dynamic이기 때문에 언제든지 변경이 가능하다. 하지만 number_of_shard는 변경이 불가능하다.
검색성능에 문제가 있다면 클러스터로서의 이점을 살리고 있는지를 먼저 살펴봐야한다.
반응형'ElasticSearch' 카테고리의 다른 글
[ElasticSearch] 인덱스 생성, 매핑, 기본 CRUD (0) 2025.11.04 ElasticSearch - text, keyword 대체 무엇이 다른가? (0) 2024.09.25 ElasticSearch - 색인과정 한눈에 보기 (0) 2024.09.23 ElasticSearch - 매핑(mapping) (0) 2024.09.22 ElasticSearch - 인덱스와 샤드 (0) 2024.09.22
