역 인덱스(Inverted Index)

일반적인 rdb들은 아래와 같이 테이블을 저장한다.

image.png

엘라스틱 서치는 데이터를 역인덱스라는 구조로 저장한다.

image.png

이 역인덱스는 책 맨뒤의 ‘찾아보기 페이지’와 동일한 역할을 한다! 엘라스틱 서치는 도큐먼트에서 추출한 term을 인덱스로 역인덱스 구조를 만들어서, term을 기반으로 도큐먼트의 id를 바로 얻어온다.

이런 구조에서는 데이터가 늘어나도 역 인덱스가 가리키는 id의 배열값이 추가되는 것 뿐이기 때문에 큰 속도 저하 없이 빠른 속도로 검색이 가능하다.

이 역인덱스는 데이터가 저장되는 과정에서 만들어지므로, 엘라스틱 서치는 데이터를 입력할때 저장이 아니라 색인한다고 표현함.

텍스트 분석

엘라스틱 서치에 저장되는 도큐먼트는 문자열(text)필드 별로 역 인덱스를 생성한다. 문자열 필드가 저장될 때마다 데이터에서 검색어 토큰을 저장하기 위해 여러 처리 과정을 거친다. (term을 분석해내기 위해)

이 전체 과정을 텍스트 분석(Text Analysis)라고 하고, 이 과정을 처리하는 기능을 애널라이저라고 한다.

엘라스틱서치의 애널라이저는 0개에서 3개의 캐릭터 필터와, 1개의 토크나이저, 그리고 0~n개의 토큰 필터로 이루어져있다.

image.png

  1. 텍스트 데이터가 입력되면 가장 먼저 필요에 따라 전체 문장에서 특정 문자를 대치하거나 제거한다. 이 과정이 캐릭터 필터를 지나면서 일어난다.

    대표적으로 3가지가 있다.

    https://www.elastic.co/docs/reference/text-analysis/character-filter-reference

    1. HTML Strip: HTML 제거
    2. Mapping character: 특정 문자 대치
    3. Pattern replace: 특정 패턴 대치(정규식)
  2. 이후 문장에 속한 단어들을 term단위로 하나씩 분리한다. 이 기능은 토크나이저가 담당하고 있다. 토크나이저는 반드시 1개만 적용할 수 있다. 예를들면 whitespace 토크나이저는 공백을 기준으로 텀을 분리함.

    자주 사용하는 토크나이저는 두가지가 있다.

    https://www.elastic.co/docs/reference/text-analysis/tokenizer-reference

    1. standard: 기본 토크나이저로 공백, 구두점, 문법으로 분리(한국어에는 부적합)

    2. nori_tokenizer: 한국어를 위한 토크나이저로 동일한 단어라도 형식, 어간, 어미에 따라 생김새가 다른 단어를 분리하기 좋다.

      https://www.elastic.co/docs/reference/elasticsearch/plugins/analysis-nori-tokenizer

  3. 분리된 term들을 후처리한다. 이 과정은 토큰 필터를 거치면서 일어난다. 예를들면 lowercase 토큰 필터를 이용해 모두 소문자로 변경할 수 있음.

    1. term중에는 사실 검색어로써 가치가 없는 term들도 있음. 대표적인에 영어의 관사들임. 이들을 불용어(stopword)라고 한다. 이들은 stop토큰 필터를 적용해 없애버리곤 함.
    2. 형태소 분석을 거쳐서 문법상 변형된 단어들을 일반적으로 검색에 쓰이는 기본 형태로 변환하기도 함. 영어에서는 snowball 필터이라는게 자주 쓰임. 이 필터는 -s, -ing 등을 제거하는 그런 기능을 함. (비슷한 필터로 stemmer도 있음.)
    3. 필요에 따라서는 동의어를 추가하기도 한다.synonym 토큰 필터를 사용해 quick텀에 동의어로 fast를 지정하면, fast로 검색했을 때 quick을 포함하는 도큐먼트가 검색되도록 한다.

애널라이저

엘라스틱서치에서는 분석된 문장을 _analyze API를 이용해 확인할 수 있다. 토크나이저는 tokenizer , 토큰 필터는 filter 항목의 값으로 입력하면 됨. 토큰 필터는 여러개를 적용할 수 있기 때문에 [ ] 안에 배열형식으로 입력한다.