일반적인 rdb들은 아래와 같이 테이블을 저장한다.
엘라스틱 서치는 데이터를 역인덱스라는 구조로 저장한다.
이 역인덱스는 책 맨뒤의 ‘찾아보기 페이지’와 동일한 역할을 한다! 엘라스틱 서치는 도큐먼트에서 추출한 term을 인덱스로 역인덱스 구조를 만들어서, term을 기반으로 도큐먼트의 id를 바로 얻어온다.
이런 구조에서는 데이터가 늘어나도 역 인덱스가 가리키는 id의 배열값이 추가되는 것 뿐이기 때문에 큰 속도 저하 없이 빠른 속도로 검색이 가능하다.
이 역인덱스는 데이터가 저장되는 과정에서 만들어지므로, 엘라스틱 서치는 데이터를 입력할때 저장이 아니라 색인한다고 표현함.
엘라스틱 서치에 저장되는 도큐먼트는 문자열(text)필드 별로 역 인덱스를 생성한다. 문자열 필드가 저장될 때마다 데이터에서 검색어 토큰을 저장하기 위해 여러 처리 과정을 거친다. (term을 분석해내기 위해)
이 전체 과정을 텍스트 분석(Text Analysis)라고 하고, 이 과정을 처리하는 기능을 애널라이저라고 한다.
엘라스틱서치의 애널라이저는 0개에서 3개의 캐릭터 필터와, 1개의 토크나이저, 그리고 0~n개의 토큰 필터로 이루어져있다.
텍스트 데이터가 입력되면 가장 먼저 필요에 따라 전체 문장에서 특정 문자를 대치하거나 제거한다. 이 과정이 캐릭터 필터를 지나면서 일어난다.
대표적으로 3가지가 있다.
https://www.elastic.co/docs/reference/text-analysis/character-filter-reference
이후 문장에 속한 단어들을 term단위로 하나씩 분리한다. 이 기능은 토크나이저가 담당하고 있다. 토크나이저는 반드시 1개만 적용할 수 있다. 예를들면 whitespace 토크나이저는 공백을 기준으로 텀을 분리함.
자주 사용하는 토크나이저는 두가지가 있다.
https://www.elastic.co/docs/reference/text-analysis/tokenizer-reference
standard: 기본 토크나이저로 공백, 구두점, 문법으로 분리(한국어에는 부적합)
nori_tokenizer: 한국어를 위한 토크나이저로 동일한 단어라도 형식, 어간, 어미에 따라 생김새가 다른 단어를 분리하기 좋다.
https://www.elastic.co/docs/reference/elasticsearch/plugins/analysis-nori-tokenizer
분리된 term들을 후처리한다. 이 과정은 토큰 필터를 거치면서 일어난다. 예를들면 lowercase 토큰 필터를 이용해 모두 소문자로 변경할 수 있음.
엘라스틱서치에서는 분석된 문장을 _analyze
API를 이용해 확인할 수 있다. 토크나이저는 tokenizer
, 토큰 필터는 filter
항목의 값으로 입력하면 됨. 토큰 필터는 여러개를 적용할 수 있기 때문에 [ ]
안에 배열형식으로 입력한다.