검색과정이란?
검색과정은 요청된 검색어를 분석한 다음
해당 검색어를 토대로 Inverted Index에서 검색을 진행한 후에
매칭되는 결과를 검색결과로 표시해주는 일련의 행위를 말한다.
Inverted Index
Inverted Index 란 문자열을 분석한 결과를 저장하고 있는 구조체이다.
예를 들어 Elasticsearch에 위와 같은 두 개의 문서를 색인(Indexing) 시켰다고 가정해 보자.
첫 번째 Document id는 1 이고 두번째 Document id 는 2라고 가정하자.
그럼 Elasticsearch 엔진은 색인과정에서
문자열을 구성하고 있는 단어들을 분석기(analyzer)를 통해서 토큰으로 분류하고
해당 토큰이 어떤 문서에 있는지 정보를 추가해 줘서
오른쪽과 같은 inverted index 정보를 생성한다.
그럼 검색과정에서 "fantasy"라는 문자열이 들어오게 되면,
fantasy라는 토큰이 들어있는 1번 문서의 정보를 응답으로 보내준다.
"wb"라는 문자열이 들어오게 되면,
해당 토큰은 1,2번 문서에 모두 존재하므로
1,2 번 문서의 정보를 모두 응답으로 보내준다.
즉 Elasticsearch는 데이터를 저장할 때, 이러한 일련의 과정을 거치기 때문에
데이터를 저장한다고 하지 않고, 색인(Indexing) 한다고 표현한다.
애널라이저 (Analyzer)
위에서 Elasticsearch에서 데이터가 저장될 때에는,
색인과정을 거쳐서 Inverted Index를 구성한다고 하였다.
Inverted Index 를 구성하는 과정 전체를 텍스트 분석(Text Analysis)이라고 하고
이 과정을 처리하는 기능을 애널라이저(Analyzer)라고 부른다.
여기서 character filter는 특수문자를 제거하거나 대치하는 역할을 수행한다.
tokenizer는 공백을 기준으로 단어를 분리하는 역할을 수행해 준다.
마지막으로 tokenfilter는 전체문자를 소문자로 변형해 주거나,
의미 없는 단어를 제거해 주는 역할을 수행해 준다.
결국 character fileter, tokenizer, token fillter를 적당히 잘 조합해서
자신만의 custom analyzer로 구성할 수 있다.
간단히 analyzer 가 어떤 식으로 작동하는지 테스트해 보자.
GET /_analyze를 통해서 text를 어떤 식으로
토큰화하는지 자세히 살펴볼 수 있다.
"analyzer"에 어떤 분석기를 쓸지 지정하면 되고,
"text"에 분석 대상 문자열을 적어주면 된다.
GET /_analyze
{
"analyzer": "standard",
"text" : "show me the monney 999999999$"
}
검색 과정의 주체
색인 과정은 Primary shard 만 맡아서 진행하지만,
검색과정은 Primary shard, Replica shard 모두가 처리할 수 있다.
만약 아래와 같이 NODE 2개로 Elasticsearch를 운영하고 있는 상황이라고 가정해 보자.
그럼 검색요청이 들어올 때, Primary shard 2개와 Replica shard 2개가 모두
분산해서 처리할 수 있다.
그런데, 운영에서 색인성능에는 문제가 없지만 검색 성능이 생각보다 좋지 않아서
검색 성능을 좀 더 높이고 싶다고 가정해 보자.
색인은 Primary shard 만 처리할 수 있지만,
검색은 Replica shard 도 처리가 가능하다.
그럼, 새로운 노드를 추가해서 Replica shard를 추가해 주면 된다.
이미 인덱스가 생성된 상황에서 Primary shard는 추가할 수 없지만,
Replica shard는 언제든 추가 가능하다. (dynamic)
위의 그림과 같이 Replica shard를 추가해 주면,
검색 처리의 부하가 더욱 분산되기 때문에,
검색 성능이 높아질 수 있다.
'Elasticsearch' 카테고리의 다른 글
[Elasticsearch] Disk-based shard allocation (1) | 2023.03.02 |
---|---|
[Elasticsearch] text, keyword 타입 (0) | 2023.03.02 |
[Elasticsearch] 색인 (Indexing) (0) | 2023.02.27 |
[Elasticsearch] Shard 란? (0) | 2023.02.22 |
[Elasticsearch] Cluster, Node 란? (0) | 2023.02.21 |