IT etc.

Elasticsearch 분석기 개요

대담이2 2020. 4. 7. 10:44

엘라스틱서치 분석기

여기서는 올바른 검색환경 구성을 위한 분석기 구성 방법과 어떻게 사용하는 지에 대해 다룹니다.

3.4.1 텍스트 분석 개요

// 쿼리
POST _analyze
{
  "analyzer": "standard",
  "text": "this is kimgn test"
}
// 결과
{
  "tokens" : [
    {
      "token" : "this",
      "start_offset" : 0,
      "end_offset" : 4,
      "type" : "<ALPHANUM>",
      "position" : 0
    },
    {
      "token" : "is",
      "start_offset" : 5,
      "end_offset" : 7,
      "type" : "<ALPHANUM>",
      "position" : 1
    },
    {
      "token" : "kimgn",
      "start_offset" : 8,
      "end_offset" : 13,
      "type" : "<ALPHANUM>",
      "position" : 2
    },
    {
      "token" : "test",
      "start_offset" : 14,
      "end_offset" : 18,
      "type" : "<ALPHANUM>",
      "position" : 3
    }
  ]
}

"this is kimgn test" 위 테스트 문장에서 "kimg"를 검색하려고 한다면? 검색되지 않는다! 

이유 : 지금 나뉘어진 토큰 안에서는 "kimgn"은 존재해도 "kimg" 는 존재하지 않기 때문

POST kimgn_test_2/_doc/1
 "text": "this is kimgn test"}




GET kimgn_test_2/_search
{
    "from": 0,
    "query":{
      "term": {
        "text": "kimg"
      }
    }
}


GET kimgn_test_2/_search
{
    "from": 0,
    "query":{
      "term": {
        "text": "kimgn"
      }
    }
}

 

 

역색인 구조란?

 아래와 같은 저장 구조로써, 위처럼 토큰을 문서로 저장하여 문서상의 위치와 출현 빈도 등을 체크하여 저장한다.

일반적인 RDB의 검색구조

출처 : https://esbook.kimjmin.net/06-text-analysis/6.1-indexing-data

Elasticsearch의 역색인 구조

출처 : https://esbook.kimjmin.net/06-text-analysis/6.1-indexing-data

ES의 색인한다는 말 : 역색인 파일을 만든다는 뜻으로, 색인 파일에 들어갈 토큰만 변경되어 저장되고, 실제 문서의 내용은 변함없이 저장됨.

 

3.4.3 분석기의 구조

분석기의 동작 프로세스

  1. 문장을 특정한 규칙에 의해 수정한다. → CHARACTER FILETER ( HTML 태그를 지우거나, 특정한 단어를 변경하는 역할을 하는 필터)
  2. 수정한 문장을 개별 토큰으로 분리한다. → TOKENIZER FILETER (분석기 구성시 하나만 사용할 수 있으며, 텍스트를 어떻게 나눌 것인지 정의한다. )
  3. 개별 토큰을 특정한 규칙에 의해 변경한다. → 토큰화된 단어를 필터링해 사용자가 원하는 토큰으로 변환한다.

 

 

 

# 분석기를 이용한 분석 방법


POST _analyze
{
  "analyzer": "standard"
, "text": ["test"]
   
}
# 기존 필드를 이용한 분석 방법
POST portdata/_analyze
{
  "field": "banner.ngram"
, "text": ["test"]
   
}

 

색인과 검색시 분석기를 각각 사용.

색인시 사용하는 Index Analyzer와 검색시 사용되는 Search Analyzer를 구분해서 사용할 수 있다. 인덱스 생성시 색인용, 검색용 분석기를 각각 정의하고, 적용하고자 하는 필드에 원하는 분석기를 지정할 수 있다.

PUT movie_analyzer
{
  "settings": {
    "analysis": {
      "analyzer": {
        "movie_lower_test_analyzer":{
          "type":"custom",
          "tokenizer":"standard",
          "filter": [
            "lowercase"
          ]
        },
        "movie_stop_test_alalyzer":{
          "type":"custom",
          "tokenizer":"standard",
          "filter" :[
            "lowercase",
            "english_stop"
            ]
        }
      },
      "filter": {
        "english_stop":{
          "type":"stop",
          "stopwords":"_english_"
        }
      }
    }
  },
  "mappings": {
    "_doc":{
      "properties":{
        "title": {
          "type":"text",
          "analyzer":"movie_stop_test_alalyzer",
          "search_analyzer":"movie_lower_test_analyzer"
        }
      }
    }
  }
}


PUT movie_analyzer/_doc/1
{
  "title": "Harry Potter and the Chamber of Secrets"
}






POST movie_analyzer/_analyze
{
  "field": "title",
  "text": "Harry Potter and the Chamber of Secrets"
}


# AND 와 OR의 검색 차이를 보자
POST movie_analyzer/_search
{
  "query": {
    "query_string": {
      "default_operator": "AND",
      "query": "Chamber of secrets"
    }
  }
}

 

3.4.3.2 대표적인 분석기

 

  1. Standard Analyzer : 가장 기본적인 분석기로, 공백 혹은 특수기호로 토큰을 분리하고, 모든 문자를 소문자로 분리하는 토큰 필터를 사용하며, (이부터는 관계자 피셜 : 자사의 특정한 알고리즘을 통해 토크나이징을 해서 가장 추천한다고 합니다.)
  2. Whitespace Analyzer : 공백 문자열을 기준으로 토큰을 분리하는 분석기
  3. Keyword Analyzer : 전체 입력 문자열을 하나의 키워드처럼 관리한다(토큰화 작업을 하지 않는다 → 집계에 가장 많이 사용하느느 토크나이저)

 

3.4.4 전처리 필터

  Document에 들어오는 문장을 미리 데이터 정제하는 것으로, 기본적으로 HTML 태그가 있음

PUT movie_analyzer_chartest
{
  "settings": {
    "analysis": {
      "analyzer": {
        "html_strip_analyzer":{
          "tokenizer":"standard",
          "char_filter": [
            "html_strip_char_filter"
          ]
        }
        },
      "char_filter": {
        "html_strip_char_filter":{
          "type":"html_strip",
          "escaped_tags":["b"]
          }
        }
      }
    },
  "mappings": {
    "_doc":{
      "properties":{
        "title": {
          "type":"text",
          "analyzer":"html_strip_analyzer"
        }
      }
    }
  }
}


POST movie_analyzer_chartest/_analyze
{
  "field": "title",
  "text":"<span> Harry Potter</span> and the <b>Chamber</b> of Secrets"
}






GET movie_analyzer_chartest/_doc/1


# span으로 검색시 검색이 안됨!
GET movie_analyzer_chartest/_search
{
    "from": 0,
    "query":{
      "term": {
        "title": "span"
      }
    }
}

 

출처 : 엘라스틱서치 실무 가이드, 엘라스틱서치 공식 홈페이지 블로그