본문 바로가기

Elasticsearch (ELK)/Elasticsearch

7-1. 데이터 색인과 텍스트 분석(이론)

1. 역 인덱스 - Inverted Index

검색 시 모든 Row안의 모든 내용을 모두 읽어야 되는 전통적인 RDBMS와 다르게 

Elasticsearch는 데이터를 저장할 시 역 인덱스(Inverted Index)라는 구조를 만들어 저장한다.

 

역 인덱스(Inverted Index) 구조

역 인덱스는 책의 맨 뒤에 있는 주요 키워드라고 생각하면 된다.

 

Elasticsearch는 데이터가 늘어나도 찾아가야 할 행이 늘어나는 것이 아니라 역 인덱스가 가리키는 id의 배열값이 추가되는 것 뿐이기 때문에 큰 속도의 저하 없이 빠른 속도로 검색이 가능합니다. 이런 역 인덱스를 데이터가 저장되는 과정에서 만들기 때문에 Elasticsearch는 데이터를 입력할 때 저장이 아닌 색인을 한다고 표현합니다.

 

2. 텍스트 분석 - Text Analysis

Elasticsearch는 문자열 필드가 저장될 때 데이터에서 검색어 토큰을 저장하기 위해 여러 단계의 처리 과정을 거칩니다. 이 전체 과정을 텍스트 분석(Text Analysis) 이라고 하고 이 과정을 처리하는 기능을 애널라이저(Analyzer) 라고 합니다. Elasticsearch의 애널라이저는 0~3개의 캐릭터 필터(Character Filter)와 1개의 토크나이저(Tokenizer), 그리고 0~n개의 토큰 필터(Token Filter)로 이루어집니다.

 

애널라이저 구성 : 캐릭터 필터 - 토크나이저 - 토큰필터

다음으로는 문장에 속한 단어들을 텀 단위로 하나씩 분리 해 내는 처리 과정을 거치는데 이 과정을 담당하는 기능이 토크나이저 입니다. 토크나이저는 반드시 1개만 적용이 가능합니다. 다음은 whitespace 토크나이저를 이용해서 공백을 기준으로 텀 들을 분리 한 결과입니다.

 

whitespace 토크나이저 적용

다음으로 분리된 텀 들을 하나씩 가공하는 과정을 거치는데 이 과정을 담당하는 기능이 토큰 필터 입니다. 토큰 필터는 0개 부터 여러 개를 적용할 수 있습니다.

 

여기서는 먼저 lowercase 토큰 필터를 이용해서 대문자를 모두 소문자로 바꿔줍니다. 이렇게 하면 대소문자 구별 없이 검색이 가능하게 됩니다. 대소문자가 일치하게 되어 같은 텀이 된 토큰들은 모두 하나로 병합이 됩니다.

 

소문자로 변경 후 같은 텀 병합

이제 역 인덱스는 아래와 같이 변경됩니다.

 

병합이 완료 된 텀

텀 중에는 검색어로서의 가치가 없는 단어들이 있는데 이런 단어를 불용어(stopword) 라고 합니다. 보통 a, an, are, at, be, but, by, do, for, i, no, the, to … 등의 단어들은 불용어로 간주되어 검색어 토큰에서 제외됩니다. stop토큰 필터를 적용하면 우리가 만드는 역 인덱스에서 the가 제거됩니다.

 

불용어 the 가 제거된 텀

이제 형태소 분석 과정을 거쳐서 문법상 변형된 단어를 일반적으로 검색에 쓰이는 기본 형태로 변환하여 검색이 가능하게 합니다. 영어에서는 형태소 분석을 위해 snowball 토큰 필터를 주로 사용하는데 이 필터는 ~s, ~ing 등을 제거합니다. 그리고 happy, lazy 와 같은 단어들은 happiness, laziness와 같은 형태로도 사용되기 때문에 ~y~i 로 변경합니다. snowball 토큰 필터를 적용하고 나면 jumpsjumping은 모두 jump로 변경되고, 동일하게 jump 로 되었기 때문에 하나의 텀으로 병합됩니다.

 

snowball 형태소 분석 적용 후 텀 병합

필요에 따라서는 동의어를 추가 해 주기도 합니다. synonym 토큰 필터를 사용하여 quick 텀에 동의어로 fast를 지정하면 fast 로 검색했을 때도 같은 의미인 quick 을 포함하는 도큐먼트가 검색되도록 할 수 있습니다. AWS 와 Amazon 을 동의어로 놓아 amazon을 검색해도 AWS 를 찾을 수 있게 하는 등 실제로도 사용되는 사례가 많습니다.

 

quick 과 fast 텀이 동의어로 저장