티스토리 뷰

728x90

 

안녕하세요. 개발개입니다.

 

위키북스에서 나온 <엘라스틱서치 실무 가이드>를 공부하면서
정리한 부분을 다음과 같은 목차에 따라 공유합니다.

(설치와 관련된 포스트는 많기 때문에 따로 작성하지 않았습니다.)

 

  1. 엘라스틱서치의 이해 (1)

  2. 엘라스틱서치의 이해 (2)

  3. 데이터 모델링

  4. 엘라스틱서치 분석기

  5. 커스텀 분석기

 

이번 글에서는 분석기와 관련하여 다음에 내용에 대해 다룹니다.

목차 
- 분석기 동작 프로세스
- 토크나이저/토큰 필터/분석기
- _analyze API

 

오타, 오류 혹은 기타 의견은 언제든지 환영합니다.



 

 

 


 

 

분석기 동작 프로세스

  • 문장을 특정한 규칙에 의해 수정합니다.

    • 전처리 필터 (CHARACTER FILTER; char_filter)

    • 문장 분석 전 replaceAll()같은 패턴 처리나, 태그 제거 등의 역할

    • 토크나이저 내부에서도 전처리가 가능하기 때문에 활용도는 떨어짐

    • 대표적인 전처리 필터 : html_strip
      기본적으로 html  태그를 모두 삭제하지만 escaped_tags 파라미터를 통해 특정 태그만 예외처리 가능

  • 수정한 문장을 개별 토큰으로 분리합니다.

    • 토크나이저 필터 (TOKENIZER FILTER)

    • 분석기의 핵심 구성요소로, 텍스트를 어떻게 나눌 것인지 정의

    • 언어 및 특징에 따라 다른 종류의 Tokenizer를 사용하며 하나의 분석기만 사용 가능

    • 기본 토크나이저 필터 아래 참고

  • 개별 토큰을 특정한 규칙에 의해 변경합니다.

    • 토큰 필터 (TOKEN FILTER)

    • 토큰화된 단어를 하나씩 필터링하여 사용자가 원하는 형태로 변환

    • 불필요한 단어 제거, 동의어 처리, 영문의 소문자 변환 작업 등

    • 토크나이저에 의해 토큰이 모두 분리되어야 동작하므로 독립 사용 불가

    • 기본 토큰 필터 아래 참고

 

 


 

기본 토크나이저 종류

엘라스틱서치에서 기본으로 제공하는 토크나이저를 비교해보면 다음과 같습니다.
(자동완성에 Ngram, Edge Ngram이 유용)

토크나이저 토큰 분리 기준
Standard Tokenizer 공백, 특수 기호
Whitespace Tokenizer 공백
Ngram Tokenizer 지정 특정 문자 혹은 글자수
Edge Ngram Tokenizer 지정 특정 문자를 만나면 시작점을 고정시켜 분리
Keyword Tokenizer 분리 안함(전체 문자열을 하나로 처리)

 

  - 예제)

예문 Eternal Sunshine of the Spotless Mind
Standard Tokenizer ["Eternal", "Sunshine", "of", "the", "Spotless", "mind"]
Whitespace Tokenizer ["Eternal", "Sunshine", "of", "the", "Spotless", "mind"]
Ngram Tokenizer
(min:3, max:3, 토큰에 문자만 포함한 예시)
["Ete", "ter", "ern", "rna", "nal", "Sun", "uns", "nsh", "shi", "hin", "ine", "the", "Spo", "pot", "otl", "tle", "les", "ess", "Min", "ind"]

Edge Ngram Tokenizer
(min:2, max:10, 토큰에 문자만 포함한 예시)

["Et", "Ete", "Eter", "Etern", "Eterna", "Eternal", "Su", "Sun", "Suns", "Sunsh", "Sunshi", "Sunshin", "Sunshine", "of", "th", "the", "Sp", "Spo", "Spot", "Spotl", "Spotle", "Spotles", "Spotless", "Mi", "Min", "Mind"]
Keyword Tokenizer ["Eternal Sunshine of the Spotless Mind"]

 

 

기본 토큰 필터 종류

엘라스틱서치에서 기본으로 제공하는 토큰 필터의 특징을 정리하면 다음과 같습니다.

토큰 필터 기능
Ascii Folding Token Filter 아스키 코드에 해당하지 않는 문자를 ASCII요소로 변환
Lowercase Token Filter 전체 문자열을 소문자로 변환
Uppercase Token Filter 전체 문자열을 대문자로 변환
Stop Token Filter 불용어(不用語)를 제거
Stemmer Token Filter 분리된 영어 등의 토큰의 원형으로 변환 (한글 미지원)
Synonym Token Filter 옵션이나 사전을 통해 동의어 변환
Trim Token Filter 앞뒤 공백 제거

 

  - 예문 : "That's such a Cliché!   "

  └ 예시) Keyword Tokenizer + Token Filter 적용

Keyword Tokenizer ["That's such a Cliché!   "]
Ascii Folding Token Filter ["That's such a Cliche!  "]
Trim Token Filter ["That's such a Cliché!"]

 

  └ 예시) Standard Tokenizer + Token Filter 적용

Standard Tokenizer ["That's", "such", "a", "Cliché"]
Lowercase Token Filter ["that's", "such", "a", "cliché"]
Uppercase Token Filter ["THAT'S", "SUCH", "A", "CLICHÉ"]
Stop Token Filter ["That's", "Cliché"]
Stemmer Token Filter ["That'", "such", "a", "Cliché"]
Synonym Token Filter
('Cliché'의 동의어를 '클리셰'로 등록한 경우)
["That's", "such", "a", "클리셰"]

 

 

기본 분석기 종류

엘라스틱서치에서 토크나이저와 토큰 필터를 합쳐,

기본으로 제공하는 세 가지 분석기를 비교해보면 다음과 같습니다.

분석기 적용 토크나이저 적용 토큰 필터
Standard Analyzer Standard Tokenizer Lowercase Token Filter
Whitespace Analyzer Whitespace Tokenizer -
Keyword Analyzer Keyword Tokenizer -

 

  - 예제)

예문 Eternal Sunshine of the Spotless Mind
Standard Analyzer 적용 ["eternal", "sunshine", "of", "the", "spotless", "mind"]
Whitespace Analyzer 적용 ["Eternal", Sunshine", "of", "the", "Spotless", "Mind"]
Keyword Analyzer 적용 ["Eternal Sunshine of the Spotless Mind"]

여기서 Standard Analyzer를 보면,

Standard Tokenizer만 사용했을 때 ["Eternal", "Sunshine", ...]로 토큰화 된 것과 달리

Lowercase Token Filter로 인해 ["eternal", "sunshine", ...]가 된 것을 확인할 수 있다.

 

 


 

_analyze API

분석기를 바로 테스트 해 볼 수 있는 API

 

  - 예시) Standard Analyzer

POST _analyze
{
  "analyzer" : "standard",
  "text" : "Eternal Sunshine of the Spotless Mind"
}

  - 결과)

{
  "tokens" : [
    {
      "token" : "eternal",
      "start_offset" : 0,
      "end_offset" : 7,
      "type" : "<ALPHANUM>",
      "position" : 0
    },
    {
      "token" : "sunshine",
      "start_offset" : 8,
      "end_offset" : 16,
      "type" : "<ALPHANUM>",
      "position" : 1
    },
    {
      "token" : "of",
      "start_offset" : 17,
      "end_offset" : 19,
      "type" : "<ALPHANUM>",
      "position" : 2
    },
    {
      "token" : "the",
      "start_offset" : 20,
      "end_offset" : 23,
      "type" : "<ALPHANUM>",
      "position" : 3
    },
    {
      "token" : "spotless",
      "start_offset" : 24,
      "end_offset" : 32,
      "type" : "<ALPHANUM>",
      "position" : 4
    },
    {
      "token" : "mind",
      "start_offset" : 33,
      "end_offset" : 37,
      "type" : "<ALPHANUM>",
      "position" : 5
    }
  ]
}

  - 예시) Keyword Analyzer + html_strip 필터 + uppercase 필터

POST _analyze
{
  "tokenizer":      "keyword", 
  "char_filter":  ["html_strip"],
  "filter" : ["uppercase"],
  "text": "<h2>Reviews</h2><div><strong>Eternal Sunshine of the Spotless Mind</strong> is a whirlwind of emotions, and it is the kind of romance that is just grounded enough, in reality, to inspire and incite, but whimsical enough to deserve its own special place in the genre's history.</div>"
}

  - 결과)

{
  "tokens" : [
    {
      "token" : """

REVIEWS

ETERNAL SUNSHINE OF THE SPOTLESS MIND IS A WHIRLWIND OF EMOTIONS, AND IT IS THE KIND OF ROMANCE THAT IS JUST GROUNDED ENOUGH, IN REALITY, TO INSPIRE AND INCITE, BUT WHIMSICAL ENOUGH TO DESERVE ITS OWN SPECIAL PLACE IN THE GENRE'S HISTORY.

""",
      "start_offset" : 0,
      "end_offset" : 282,
      "type" : "word",
      "position" : 0
    }
  ]
}

 

 

 

다음 이야기 : [Elasticsearch] - 5. 커스텀 분석기

 

 

 


 

 

 

본 글은 다음을 참고하여 작성되었습니다.

 

권택한 외, 엘라스틱서치 실무가이드, 위키북스

 

 

 

728x90
Total
Today
Yesterday
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
04-26 00:14