🛠️TOOL/🔭Elasticsearch

[Elasticsearch] - 엘라스틱 서치의 색인 With 분석기

KangManJoo 2024. 4. 1. 15:01

역 인덱스 (Inverted index)

ES는 텍스트와 도큐먼트를 인덱싱 시점에 용어 단위로 분해하고 역인덱스 사전을 구축한다.

특히, 기존의 데이터로 처리하기 힘든 대량의 비정형 데이터 검색이 가능하며, 전문 검색과 구조 검색 모두를 지원한다.

그리고 데이터들을 집계를 위해 최적화하고, 이를 바탕으로 병렬처리나 분산처리가 가능하다.

 

다소 생소한 개념인 역인덱스를 하는 과정을 알아보자.

먼저 평범한 관계형 DB에 다음과 같이 데이터를 저장한다고 생각해보자.

만약 이 데이터베이스에서 fox가 포함된 행을 찾는다면, Like %fox%를 사용해 모든 데이터베이스를 읽어야한다. 그러나 이러한 전방위 검색은 절대 해서는 안되는 불문율이 있다. (데이터가 많으면 시스템이 맛이 갈 수도 있다)

 

따라서 ES는 데이터를 저장할 때 다음과 같이 역 인덱스(inverted index)라는 구조를 만들어 저장한다.

ES에서는 추출된 키워드를 term이라고 부르고, 해당 텀을 보유한 도큐먼트를 역 인덱스 사전에 저장한다. 따라서 fox를 포함하고 있는 도큐먼트들의 id를 바로 얻어올 수 있게된다.

이러한 역 인덱스를 데이터가 저장되는 과정에서 만들기 때문에 ES는 데이터를 저장한다고 하지 않고 색인한다고 표현한다.

 

텍스트 분석(Text Analysis)

ES는 위처럼 역 인덱스 사전을 만들 때 검색어 토큰을 저장하기 위해 여러 단계의 처리 과정을 거친다. 이 과정을 텍스트 분석이라 하고, 이 과정을 처리하는 기능을 분석기(Analyzer) 라고 한다.

애널라이저의 구성 요소는 위와 같다.

쓸모 없는 특정 문자를 캐릭터 필터에서 걸러내고, 문장에 속한 단어를 토큰 단위로 분리하는 것이 토크나이저, 그리고 분리된 토큰들을 필터링하여 텀으로 만드는 과정을 담당하는 기능이 토큰 필터이다.

토크나이저에서 분리된 이후의 상태를 토큰(Token),

토큰 필터를 거쳐 인덱스에 저장될 때의 상태를 용어(Term) 이라고 한다.

텍스트 분석 예시

캐릭터 필터를 걸러져 나온 토큰들을 토크나이저로 위와 같이 분리하고,

토큰 필터를 이용해 대소문자 구별 없이 검색이 가능하도록 한다.

위 과정에서 대소문자 변환 후 같아진 텀들을 병합한다.

영어에서는 stop필터(불용어 필터)와 형태소 분석을 위해 snowball필터를 사용하는데, 불용어 필터에 의해 the가 제거되고, snowball필터에 의해 jumps와 jumping등은 모두 jump로 병합된다.

synonym 토큰 필터를 이용해 quick의 동의어인 fast를 추가해, fast로 검색해도 quick을 포함하는 도큐먼트가 검색되게 할 수도 있다. 이처럼 토큰 필터는 다양한 활용 방법이 있다.

 

분석기 테스트

엘라스틱 서치는 토크나이저와 토큰필터를 테스트해 볼 수 있는 analyze라는 이름의 REST API를 제공한다.

사용법은 analyzer 에 원하는 분석기를 선택하고, text 에 분석할 문자열을 입력하면 된다.

 

다음 예시와 같이 키바나 콘솔에서 간단하게 stop 분석기를 테스트해보자.

스톱 분석기는 소문자 변경 토크나이저와 스톱 필터(불용어 제거)로 구성되어 있다.

따라서 most와 loving, dog, breeds는 남고 the, 10 등은 제거된 것을 볼 수 있다.

다음과 같이 토크나이저와 필터도 테스트 가능하다.

 

분석기의 종류

standard : 기본 분석기이다.스탠다드 토크나이저와 lower 필터, 스톱 필터가 포함된다.

simple : 문자만 토큰화한다. 공백, 숫자, - , ‘ 같은 문자는 토큰화하지 않는다.

whitespace: 공백을 기준으로 구분하여 토큰화한다.

stop: simple과 비슷하나 스톱 필터가 포함된다.

 

토크나이저 종류

standard : 기본 토크나이저이다. 쉼표, 점(.)같은 기호를 제거하여 텍스트 기반으로 토큰화한다.

lowercase : 텍스트 기반으로 토큰화하며 모든 문자를 소문자로 변경한다.

ngram: 원문으로부터 N개의 연속된 글자 단위를 모두 토큰화한다. 정밀하지만 저장공간을 많이 차지하고, N개 이하의 글자 수로는 검색이 불가능하다.

uax_url_email : 스탠다드와 비슷하지만 URL이나 이메일 토큰화에 강점이 있다.

온라인 문서에서 ES가 지원하는 모든 분석기/토크나이저를 확인 가능하다.

 

커스텀 분석기

이번에는 커스텀한 분석기를 적용한 인덱스를 생성하는 예시를 보자.

PUT custom_index
{
  "settings": {
    "analysis": {
      "filter": {
        "my_stopwords": {
          "type": "stop",
          "stopwords": [
            "lions"
          ]
        }
      },
      "analyzer": {
        "my_analyzer": {
          "type": "custom",
          "char_filter": [],
          "tokenizer": "standard",
          "filter": [
            "lowercase",
            "my_stopwords"
          ]
        }
      }
    }
  }
}

custom_index라는 인덱스는 인덱스 setting에 analysis 파라미터를 추가하고, 필터와 분석기를 만든다.

분석기 이름을 지정하고 타입을 custom으로 지정하면 커스텀 분석기를 의미한다.

해당 분석기는 캐릭터 필터는 사용하지 않고, 스탠다드 토크나이저를 사용, 필터는 lowercase와 직접 만든 my_stopwords를 사용한다.

my_stopwordsstop필터에 사용자가 지정한 lions라는 불용어를 추가한 필터이다.

 

결과는 다음과 같이 나온다.

 

단, 필터의 순서도 중요하다. 만약 lowercase보다 my_stopwords가 앞에 있었다면

Lions가 lions로 필터링 되기전에 먼저 불용어 필터를 거치므로 Lions는 필터링되지 않는다.

 

reference