티스토리 뷰

이번 포스팅은 사내에서 Elasticsearch 관련 내용 발표를 위해 "시작하세요! 엘라스틱서치"서적을 기반으로 학습하고 이해한 내용을 정리하는 포스팅이다. Elasticsearch 역시 내용이 많기 때문에 시리즈로 나눠서 정리할 예정이다. 모든 내용은 Elasticsearch 7.6 버전 기준이다.

 

오늘은 Elasticsearch 의 Analyzer 에 대해서 알아볼 예정이다.  

분석(Analyzer)

Elasticsearch 는 색인(Indexing) 할 때 입력된 데이터는 텀(term) 으로 추출하기 위한 과정을 거치는데 이 과정을 Analyzer 라고 한다. Analyzer 는 하나의 Tokenizer 와 0 개 이상의 Token Filter 로 구성되어 있다. Tokenizer 는 입력된 데이터를 토큰으로 분리하는 작업을 하고 Token Filter 는 Tokenizer 로 분리된 토큰들에 필터를 적용하는 역할을 한다. 이렇게 Tokenizer 와 Token Filter 과정을 거치면 검색을 위한 텀(term) 이 추출된다. 

 

대략적인 분석에 대한 과정들을 알아봤다. 이번에는 예시를 통해 분석 과정에 대해서 조금 더 자세히 알아보자. 

예를 들어 "The 2 QUICK Brown-Foxes jumped over the lazy dog bone." 라는 데이터가 whitespace Tokenizer 와 lowercase, stop Token Filter 를 사용했을 때의 분석과정을 살펴보자. 

whitespace Tokenizer 는 공백 또는 줄 바꿈을 기준으로 토큰을 분리하는 Tokenizer 이다.
예시 문장은 whitespace Tokenizer 를 통해서 다음과 같은 단어들로 분리된다.

[ "The" "2" "QUICK" "Brown-Foxes" "jumped" "over" "the" "lazy" "dog" "bone." ] 

 

이렇게 분리된 단어들은 lowercase Token Filter 를 거치면서 모두 소문자로 변환된다. 

[ "the" "2" "quick" "brown-foxes" "jumped" "over" "the" "lazy" "dog" "bone." ]

 

그 후 stop Token Filter 를 거치면 최종적으로 다음과 같이 변환된다.
stop Token Filter 는 stopwords 에 해당하는 토큰들을 목록에서 제외시키는 역할을 한다. 여기서는 stopwords 에 해당하는 the 가 제외되었다. 

["2" "quick" "brown-foxes" "jumped" "over" "lazy" "dog" "bone." ]

 

_analyze API 

위에서 우리가 확인했던 과정을 Elasticsearch 를 이용해서 다시 한번 확인해보자. 

_analyze API 를 이용하면 입력한 데이터를 분석한 결과를 확인할 수 있다. 

# Tokenizer 로 whitespace 만 지정했을때 
curl -H 'Content-Type: application/json' -X GET 'localhost:9200/_analyze?pretty' -d '
{
  "tokenizer" : "whitespace",
  "filter" : [],
  "text" : "The 2 QUICK Brown-Foxes jumped over the lazy dog bone."
}'

--- 반환값 ---

{
  "tokens" : [
    { "token" : "The", ... },
    { "token" : "2",   ... },
    { "token" : "QUICK", ... },
    { "token" : "Brown-Foxes", ... },
    { "token" : "jumped", ...},
    { "token" : "over", ... },
    { "token" : "the", ... },
    { "token" : "lazy", ... },
    { "token" : "dog", ... },
    { "token" : "bone.", ... }
  ]
}

Tokenizer 를 지정했을 때 위와 같이 분리되는 것을 확인할 수 있었다. 이번에는 Token Filter 들을 적용해보자. 

curl -H 'Content-Type: application/json' -X GET 'localhost:9200/_analyze?pretty' -d '
{
  "tokenizer" : "whitespace",
  "filter" : ["lowercase", "stop"],
  "text" : "The 2 QUICK Brown-Foxes jumped over the lazy dog bone."
}'

--- 반환값 ---

{
  "tokens" : [
    { "token" : "2",   ... },
    { "token" : "quick", ... },
    { "token" : "brown-foxes", ... },
    { "token" : "jumped", ...},
    { "token" : "over", ... },
    { "token" : "lazy", ... },
    { "token" : "dog", ... },
    { "token" : "bone.", ... }
  ]
}

2 개 이상의 Token Filter 는 지정된 순서대로 적용된다는 것만 주의하자.

_analyze API 에 대한 자세한 내용은 여기 에서 확인할 수 있다. 

 

Analyzer

이제 우리는 Analyzer 가 어떻게 구성되어 있고 동작하는지에 대해서 확인해봤다. 

이번에는 Elasticsaerch 에서 기본으로 제공하고 있는 Analyzer 들에 대해서 알아보자.

1. Standard Analyzer

 Analyzer 를 지정하지 않을 경우 기본으로 사용하는 Analyzer 이다. 

Tokenizer : Standard Tokenizer

Token Filter : [ Lower Case Token Filter, Stop Token Filter ]

 

2. Simple Analyzer

 문자와 문자가 아닌 것을 기준으로 토큰을 자르는 Analyzer 이다. 

Tokenizer : Lower Case Tokenizer

Token Filter : []

 

3. Whitespace Analyzer

 공백 문자를 기준으로 토큰을 자르는 Analyzer 이다.

Tokenizer : Whitespace Tokenizer

Token Filter : []

 

4. Stop Analyzer

 Simple Analyzer 와 동일한 기준으로 토큰을 자르지만 stopwords 를 제거하기 위한 필터가 추가되어 있는 Analyzer 이다. 

Tokenizer : Lower Case Tokenizer

Token Filter : [Stop Token Filter]

 

5. Keyword Analyzer

 문자열 전체를 단일 토큰으로 지정하는 Analyzer 이다. 

Tokenizer : Keyword Tokenizer

Token Filter : []

 

그 외의 다양한 Analyzer 들은 여기 에서 확인할 수 있다.

 

Custom Analyzer

Elasticsearch 는 기본적으로 제공하고 있는 Analyzer 외에 추가로 사용자가 임의로 Tokernizer 와 Token Filter 를 선택해서 Custom Analyzer 를 만들 수 있다. Custom Analyzer 는 Index 단위로 저장되며 해당 Index 에 데이터를 색인(Indexing) 할 때 분석기를 명시해서 사용할 수 있다. 분석기는 Index 의 setting 옵션을 사용해서 생성하며 명령어는 다음과 같다.

{
  "settings": {
    "analysis": {
      "analyzer": {
        <분석기명> : {
          "tokenizer": <Tokenizer>,
          "filter" : [<Token Filter> ... ]
        },
        ...
      },
      "tokenizer": {
        <토크나이저명> : {
          "type": <토크나이저 타입>,
          <토크나이저 옵션>
        },
        ...
      },
      "filter": {
        <토큰필터 명>: {
          "type": <토큰필터 타입>,
          <토큰필터 옵션>
        },
        ...
      }
    }
  }
}

 예를 들어 my_analyzer 라는 분석기를 생성해보자. 

curl -H 'Content-Type: application/json' -X PUT 'localhost:9200/my_analyzer?pretty' -d '
{
  "settings": {
    "analysis": {
      "analyzer": {
        "my_analyzer": {
          "tokenizer": "whitespace",
          "filter": ["lowercase", "my_stop"]
        }
      },
      "filter": {
        "my_stop": {
          "type": "stop",
          "stopwords": ["quick", "lazy", "over", "dog"]
        }
      }
    }
  }
}'
--- 반환값 ---
{
  "acknowledged" : true,
  "shards_acknowledged" : true,
  "index" : "my_analyzer"
}

 my_analyzer 는 whitespace Tokenizer 를 사용하고 lowercase Token Filter 와 my_stop 이라는 custom stop Token Filter 를 사용하도록 정의한다. 그리고 my_stop Token Filter 는 "quick", "lazy", "over", "dog" 를 stopwords 로 등록되어 있다. 

 이제 my_analyzer 를 이용해서 위에서 분석했던 "The 2 QUICK Brown-Foxes jumped over the lazy dog bone." 데이터를 다시 한번 분석하면 다음과 같은 결과가 나온다. 

curl -H 'Content-Type: application/json' -X GET 'localhost:9200/my_analyzer/_analyze?pretty' -d '
{
  "analyzer" : "my_analyzer",
  "text" : "The 2 QUICK Brown-Foxes jumped over the lazy dog bone."
}'
--- 반환값 ---
{
  "tokens" : [
    { "token" : "the", ... },
    { "token" : "2", ... },
    { "token" : "brown-foxes", ... },
    { "token" : "jumped", ... },
    { "token" : "the", ... },
    { "token" : "bone.", ... }
  ]
}

 이전과는 다르게 the 가 제거되지 않았고, my_stop Token Filter 에 등록된 stopwords 는 제거된 것을 확인할 수 있다. 

Custom Analyzer 에 대한 자세한 내용은 여기 에서 확인할 수 있다. 

 

오늘은 여기까지~

누군가에게 도움이 되었길 바라면서 오늘의 포스팅 끝~

댓글