ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 08. 엘라스틱서치 분석기
    BackEnd/elasticsearch 2021. 9. 24. 18:00
    반응형

      엘라스틱서치는 루씬을 기반으로 구축된 텍스트 기반 검색엔진입니다. 루씬은 내부적으로 다양한 분석기를 제공하는데, 엘라스틱서치는 루씬이 제공하는 분석기를 그대로 활용합니다.

     

    1. 분석기의 구조

    1) CHARACTER FILTER (문장을 특정한 규칙에 의해 수정한다.)

      문장을 분석하기 전에 입력 테스트에 대해 특정한 단어를 변경하거나 HTML과 같은 태그를 제거하는 역할을 하는 필터다. 해당 내용은 텍스트를 개별 토큰화하기 전의 전처리 과정이며, ReplaceAll() 함수처럼 패턴으로 텍스트를 변경하거나 사용자가 정의한 필터를 적용할 수 있다. 토크나이저 내부에서도 일종의 전처리가 가능하기에 상대적으로 활용도가 많이 떨어진다.

         

    2) TOKENIZER FILTER (수정한 문장을 개별 토큰으로 분리한다.)

      Tokenizer Filter는 분석기를 구성할 때 하나만 사용할 수 있으며 텍스트를 어떻게 나눌 것인지를 정의한다. 한글을 분해할 때는 한글 형태소 분석기의 Tokenizer를 사용하고, 영문을 분석할 때는 영문 형태소 분석기의 Tokenizer를 사용하는 등 상황에 맞게 적절한 Tokenizer를 사용하면 된다.

     

    3) TOKEN FILTER (개별 토큰을 특정한 규칙에 의해 변경한다.)

      토큰화된 단어를 하나씩 필터링해서 사용자가 원하는 토큰으로 변환한다. 예를 들어, 불필요한 단어를 제거하거나 동의어 사전을 만들어 단어를 추가하거나 영문 단어를 소문자로 변환하는 등의 작업을 수행할 수 있다. Token Filter는 여러 단계가 순차적으로 이뤄지며 순서를 어떻게 지정하느냐에 따라 검색의 질이 달라질 수 있다.

    PUT custom_analyzer
    {
       "settings":{
          "index": {
            "number_of_shards": 5,
            "number_of_replicas": 1
          }
        },
        "analysis":{
           "analyzer":{
              "custom_analyzer":{
                 "type":"custom",
                 "char_filter": [        # Character Filter (전체 문장에서 HTML 태그 제거)
                   "html_strip"          # "escaped_tags": ["b"] 옵션 (제외하지 않을 HTML 태그 정의)
                 ],
                 "tokenizer":"standard", # Tokenizer Filter (특수문자 혹은 공백 기준 텍스트 분할)
                 "filter":[
                    "lowercase"          # Token Filter (소문자 변환)
                 ]
             }
          }
       }
    }

     

    2. 분석기 사용법

      엘라스틱서치에서 제공하는 Analyze API를 이용하면 손쉽게 분석 결과를 확인할 수 있습니다.

    # 요청
    POST _analyze
    {
      "analyzer" : "standard",
      "text" : "우리나라가 좋은나라, 대한민국 화이팅"
    }
    
    # 결과
    {
      "tokens" : [
        {
          "token" : "우리나라가",
          "start_offset" : 0,
          "end_offset" : 5,
          "type" : "<HANGUL>",
          "position" : 0
        },
        {
          "token" : "좋은나라",
          "start_offset" : 6,
          "end_offset" : 10,
          "type" : "<HANGUL>",
          "position" : 1
        },
        {
          "token" : "대한민국",
          "start_offset" : 12,
          "end_offset" : 16,
          "type" : "<HANGUL>",
          "position" : 2
        },
        {
          "token" : "화이팅",
          "start_offset" : 17,
          "end_offset" : 20,
          "type" : "<HANGUL>",
          "position" : 3
        }
      ]
    }
    
    # 필드를 이용한 분석
    POST movie_analyzer/_analyze
    {
      "field": "title",
      "text": "캐리비안의 해적"
    }

      색인과 검색 시 분석기를 각각 설정할 수 있습니다.

    PUT movie_analyzer
    {
       "settings":{
          "index": {
            "number_of_shards": 5,
            "number_of_replicas": 1
          },
          "analysis":{
             "analyzer":{
                "movie_lower_test_analyzer":{
                   "type":"custom",
                   "tokenizer":"standard",
                   "filter":[
                      "lowercase"
                   ]
                },
                "movie_stop_test_analyzer":{
                   "type":"custom",
                   "tokenizer":"standard",
                   "filter":[
                      "lowercase",
                      "english_stop"
                   ]
                }
             },
             "filter":{
                "english_stop":{
                   "type":"stop",
                   "stopwords":"_english_" # 불용어(Stopword)
                }
             }
          }
       },
       "mappings":{
          "_doc":{
             "properties":{
                "title": {
                   "type":"text",
                   "analyzer":"movie_lower_test_analyzer",
                   # 검색 분석기, 미정의 시 "analyzer" 설정과 같다.
                   "search_analyzer":"movie_stop_test_analyzer"
                }
             }
          }
       }
    }

     

    3. 분석기

    Standard Analyzer (Default) 공백 혹은 특수 기호를 기준으로 토큰을 분리하고 모든 문자를 소문자로 변경하는 토큰 필터를 사용한다.
    Whitespace 분석기 공백 문자열을 기준으로 토큰을 분리한다.
    Keyword 분석기 전체 입력 문자열을 하나의 키워드처럼 처리한다. 토큰화 작업을 하지 않는다.

     

    4. 토크나이저

    Standard 토크나이저 대부분의 기호를 만나면 토큰으로 나눈다.
    WHITESPACE TOKENIZER 공백을 만나면 텍스트를 토큰화한다.
    Ngram 토크나이저 기본적으로 한 글자씩 토큰화한다. 특정 문자를 지정할 수도 있으며, 이 경우 지정된 문자의 목록 중 하나를 만날 때마다 단어를 자른다. 그 밖에도 다양한 옵션을 조합해서 자동완성을 만들 때 유용하게 활용할 수 있다.
    Edge Ngram 토크나이저 지정된 문자의 목록 중 하나를 만날 때마다 시작 부분을 고정시켜 단어를 자르는 방식으로 사용하는 토크나이저다. 자동 완성을 구현할 때 유용하게 활용할 수 있다.
    Keyword 토크나이저 텍스트를 하나의 토큰으로 만든다.

     

    5. 토큰 필터

    Ascii Folding 토큰 필터 아스키 코드에 해당하는 127개 알파벳, 숫자, 기호에 해당하지 않는 경우 문자를 ASCII 요소로 변경한다.
    Lowercase 토큰 필터 전체 문자열을 소문자로 변환한다.
    Uppercase 토큰 필터  전체 문자열을 대문자로 변환한다.
    Stop 토큰 필터 불용어로 등록할 사전을 구축해서 사용하는 필터를 의미한다. 인덱스로 만들고 싶지 않거나 검색되지 않게 하고 싶은 단어를 등록해서 해당 단어에 대한 불용어 사전을 구축한다.
    Stemmer 토큰 필터 Stemming 알고리즘을 사용해 토큰을 변형하는 필터다.
    Synonym 토큰 필터 동의어를 처리할 수 있는 필터다.
    1) 동의어 추가 : 단어를 쉼표(,)로 분리해 등록한다.
      예) elasticsearch, 엘라스틱서치
    2) 동의어 치환 : 원본 토큰이 제거되고 변경될 새로운 토큰이 추가된다. 화살표(=>)로 표시한다.
      예) "Henry => 헨리"
    (주의) 동의어 사전 변경 시 인덱스를 Reload해야 한다.
      > POST movie_analyzer/_close
      > POST movie_analyzer/_open
    Trim 토큰 필터 앞뒤 공백을 제거한다.

     

    반응형

    'BackEnd > elasticsearch' 카테고리의 다른 글

    10. 검색 API  (0) 2021.09.25
    09. 문서관리 API(Document API)  (0) 2021.09.24
    07. 데이터 타입(Data Type)  (0) 2021.09.20
    06. 메타 필드(Meta Fields)  (0) 2021.09.19
    05. 매핑 API  (0) 2021.09.19

    댓글

Designed by Tistory.