본문 바로가기
Infra/DB

[ElasticSearch]기초 알아가기 03.

by seeker00 2025. 6. 23.

분석기

엘라스틱 서치는 역인덱싱 기술을 통해 전문 검색을 지원한다.

  • 이 때 문자열을 나누는 기준이 아주 중요하다.
  • 전문 검색: 장문의 문자열에서 부분 검색을 수행하는 것
  • 역인덱싱: 장문의 문자열을 분석해 작은 단위로 쪼개어 인덱싱하는 기술

엘라스틱 서치는 이를 지원하기 위해 캐릭터 필터, 토크나이저 tokenizer, 토큰 필터로 구성되어 있는 분석기 모듈을 갖고 있다.

  • 분석기에 토크나이저는 반드시 하나가 포함되어야 하고, 캐릭터 필터와 토큰 필터는 옵셥이므로 없어도 되고 여러 개를 함께 사용할 수도 있다.
  • 엘라스틱 서치에서 제공하는 분석기를 사용할 수 있고, 필터와 토크나이저 조합을 구성하여 분석기를 커스텀해서 사용할 수도 있다.

토큰과 용어

  • 토큰 token: 토크나이저를 이용해 필터링된 문자열을 자르게 되는데, 이 때 잘린 단위를 토큰이라고 지칭한다.
  • 용어 term: 토큰들이 복수의 토큰 필터를 거치며 정제된 다음, 최종으로 역인덱스에 저장되는 상태의 토큰들을 말한다.

분석기 구성

구성요소 설명
캐릭터 필터 문자열의 전처리 작업, 입력받은 문자열을 변경하거나 불필요한 문자들을 제거한다.
토크나이저 문자열을 토큰으로 분리한다. 분리할 때 토큰의 순서나 시작, 끝 위치도 기록한다.
토큰 필터 분리된 토큰들의 필터 작업(후처리 작업)을 한다. 대소문자 구분, 형태소 분석 등의 작업이 가능하다.
  • 분리된 토큰들은 필터를 거쳐 최종적으로 용어가 되고, 이를 인덱싱해서 전문 검색에 활용하게 된다.

역인덱싱

역인덱스는 색인 페이지와 같다.

  • 역인덱스 테이블은 용어가 어떤 문서에 속해 있는지 기록하여 손쉽게 해당 단어가 들어 있는 문서 검색을 수행할 수 있다.

분석기 API

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

POST _analyze
{
  "analyzer": "stop",
  "text": "The 10 most loving dog breeds."
}
  • stop 분석기는 lowercase 토크나이저와 stop 토큰 필터로 구성되어 있다.
    • stop 분석기는 불용어(데이터 집합에 출연하는 빈도는 매우 높지만, 의미가 없는 단어)를 처리한다.

분석기 종류

다양한 분석기가 존재하는데 그 중 자주 사용되는 분석기를 나열해본다.

분석기 설명
standard 디폴트로 사용되는 분석기, 영문법을 기준으로 한 스탠다드 토크나이저와 소문자 변경 필터, 스톱 필터가 포함
simple 문자만 토큰화, 공백, 숫자, 하이픈(-)이나 작은 따옴표(') 같은 문자는 토큰화하지 않는다.
whitespace 공백을 기준으로 구분하여 토큰화
stop simple 분석기와 유사하나 스톱 필터가 포함

토크나이저

분석기는 반드시 하나의 토크나이저를 포함해야 한다. 토크나이저는 문자열을 분리해 토큰화하는 역할을 한다.
반드시 포함되는 요소이므로 형태에 맞는 토크나이저 선택이 중요하다.

토크나이저 설명
standard 스탠다드 분석기가 사용하는 토크나이저, 디폴트로 사용된다. 쉼표(,), 점(.) 같은 기호를 제거하고 텍스트 기반으로 토큰화
lowercase 모든 문자를 소문자로 변경해 텍스트 기반으로 토큰화
ngram 원문으로부터 N개의 연속된 글자 단위를 모두 토큰화, 원문으로부터 검색할 수 있는 거의 모든 조합을 얻어낼 수 있기 때문에 정밀한 부분 검색에 강점을 가진다. 그러나 토크나이징을 수행한 N개 이하의 글자 수로는 검색이 불가능하며 저장공간을 많이 차지한다는 단점 예) '엘라스틱서치' 를 2gram으로 토큰화 한 결과 -> [엘라, 라스, 스틱, 틱서, 서치]와 같이 연속된 두 글자를 모두 추출
uax_url_email 스탠다드 토크나이저와 유사하나 URL이나 이메일을 토큰화하는 데 강점
  • 분석기와 마찬가지로 토크나이저를 테스트 해 볼 수 있다.

    POST _analyze
    {
    "tokenizer": "uax_url_email",
    "text": "email: elastic@elk-company.com"
    }

필터

분석기에 필터는 옵션으로, 없어도 되고 하나 이상을 포함할 수 있다.

  • 필터 역시 analyze API를 이용해 테스트해볼 수 있다.
  • 필터는 단독으로 사용할 수 없고, 반드시 토크나이저가 있어야 한다.
POST _analyze
{
  "tokenizer": "standard",
  "filter": ["uppercase"],
  "text": "The 10 most loving dog breeds."
}
  • 필터는 [] 배열 안에 여러 개를 적을 수 있고, 필터가 여러 개면 작성된 순서대로 적용된다.

캐릭터 필터

토크나이저 전에 위치하며 문자들을 전처리하는 역할을 한다.

  • HTML 문법을 제거/변경하거나 특정 문자가 왔을 때 다른 문자로 대체하는 일들을 한다.
  • 엘라스틱서치가 제공하는 분석기들은 대부분 캐릭터 필터를 포함하지 않으므로, 필요하다면 커스텀 분석기를 만들어 사용한다.

토큰 필터

토크나이저에 의해 토큰화되어 있는 문자들에 필터를 적용한다. 즉 토큰들을 변경하거나 삭제하고 추가하는 작업들이 가능하다.
종류가 아주 많고 자주 변경되는 요소이므로 자주 사용되는 토큰 필터 몇 가지만 나열한다.

필터 설명
lowercase 모든 문자를 소문자로 변환
stemmer 영어 문법을 분석하는 필터, 형태소를 분석해 어간을 분석하는 필터, 한글의 경우 아리랑, 노리 같은 오픈소스가 존재함
stop 기본 필터에서 제거하지 못하는 특정한 단어를 제거

커스텀 분석기

사용자가 직접 토크나이저, 필터 등을 조합해 사용할 수 있는 분석기이다.

설정

  • 인덱스에 커스텀 분석기를 등록하여 생성할 수 있다.

    PUT test_analyzer
    {
    "settings": {
      "analysis": {
        "filter": {
          "my_stopwords": {
            "type": "stop",
            "stopwords": ["lions", "My"]
          }
        },
        "analyzer":{
          "my_analyzer": {
            "type": "custom",
            "char_filter": [],
            "tokenizer": "standard",
            "filter": ["lowercase", "my_stopwords"]
          }
        }
      }
    }
    }
  • 인덱스 설정 settings에 analysis 파라미터를 추가하고 analysis 파라미터 밑에 필터(filter)와 분석기(analyzer)를 만든다.

    • 분석기에는 반드시 토크나이저가 하나 들어가야 한다.

    • 커스텀 분석기나 커스텀 필터는 설정된된 인덱스 내에서만 유효하다.

      GET test_analyzer/_analyze
      {
      "analyzer": "my_analyzer",
      "text": "Cats Lions Dogs"
      }
  • 분석기 API를 이용해 커스텀 분석기를 통해 문자열을 분석하는 요청을 보낸다.

필터 적용 순서

  • 커스텀 분석기에 필터를 여러 개 사용하는 경우, 필터의 순서에 주의를 기울일 필요가 있다.

    GET test_analyzer/_analyze
    {
    "tokenizer": "standard",
    "filter": ["lowercase", "my_stopwords"],
    "text": "My Cats Lions Dogs"
    }
  • 필터는 제시된 배열의 첫 번째 순서부터 적용되는데, 순서가 잘못되면 원했던 결과가 제대로 나오지 않을 수 있다.

    • 예를 들어 필터에서 "My" 라는 용어를 제외하도록 설정해두었는데 해당 필터 앞에 lowercase 필터가 위치하게 되면, "My"는 "my" 가 되어서 제외되지 않고 인덱싱이 된다.
    • 가능하면 모든 문자를 소문자로 변환한 후에 필터를 적용하는 것이 실수를 줄일 수 있는 방법이다.

참고 자료