본문 바로가기

ELK스택

[Elasticsearch] 데이터 색인과 텍스트 분석

이번 글에서는 2가지를 정리해 보려고 합니다.

  • 역 인덱스(Inverted index)
  • 텍스트 분석과정(Text Analysis)

참고로 이번에 사용하는 이미지는 https://esbook.kimjmin.net/06-text-analysis/6.1-indexing-data에서 인용하였습니다.

역 인덱스(Inverted index)

역 인덱스를 알아보기 전에 RDBMS에 대해서 먼저 알아보도록 하겠습니다.

Oracle이나 MySql같은 관계형데이터베이스는 "fox"라는 단어가 들어 있는 데이터를 검색할 때, Text컬럼을 한줄씩 내려오면서 검색하게 됩니다.

이럴경우 테이블에 데이터가 많으면, 모든 로우를 읽고 판단해야하기 때문에 시간이 오래걸리게 됩니다.

RDBMS경우

Elasticsearch에서는 데이터를 저장할 때, 아래와 같은 역 인덱스 구조로 데이터를 저장하게 됩니다.

즉, RDBMS에서 하나의 ID에 Text컬럼을 저장했다면, Elasticsearch는 Text컬럼에 들어갈 내용을 텀(Term)형태로 나누고 각각의 텀(Term)이 들어간 도큐먼트들을 ID에 배열 형태로 저장하는 방식입니다.

예를들어 "fox"를 포함하고 있는 도큐먼트들의 ID를 바로 확인할 수 있습니다.

이러한 방식의 장점은 데이터가 늘어나도 검색해야 할 로우가 늘어나는 것이 아니라 역 인덱스가 가르키는 ID값의 배열값만 추가되기 때문에 속도에는 전혀 지장이없는 장점이 있습니다.

Elasticsearch경우

 

텍스트 분석과정(Text Analysis)

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

캐릭터 필터 : 데이터가 입력되고, 특정 문자나 문장을 대체하거나 제거해주는 역할

토크나이저 : 데이터에 속한 단어들을 텀 단위로 나누는 역할

토큰 필터 : 분리 된 텀들을 가공하는 역할

 

토큰 필터는 여러가지 필터를 가지고 있지만, 한가지 예를들어 lowercase필터를 사용해 보겠습니다.

각각의 텀들중에 동일한 단어이지만, 대소문자만 다른 텀들이 존재합니다.

예를들어 "The" 와 "the"입니다. 지금은 다른 텀으로 나누어져 있지만, lowercase필터가 가공을 합니다.

결과적으로 아래와 같은 역 인덱스가 변경이 됩니다.

토큰 필터는 여러가지가 있지만, 상황에 맞춰 찾아서 사용하시면 될 것 같습니다.