본문 바로가기
Big Data/ElasticSearch

[ElasticSearch] 한글 형태소 분석기 Nori 플러그인 설치 및 실행

by Dogf 2021. 8. 23.
반응형

ElasticSearch에 Nori 플러그인을 설치해봅니다.

 

Nori는 한글 형태소 분석을 위한 Elasticsearch 플러그인입니다.

 

한글 검색엔진 구축 시 대중 적으로 활용되는 플러그인입니다.

 

0. 준비하기

본 내용을 수행하시기 위해서는 ElasticSearch와 Kibana가 설치되어 있어야 합니다.

 

1) Elasticsearch 설치하기

 

https://dogf.tistory.com/60

 

[ElasticSearch] 설치

Elastic의 검색엔진 ElasticSearch를 설치하는 방법을 알려드리겠습니다. 다운로드 링크 접속 > 파일 다운로드 > 압축해제 (끝) 먼저, ElasticSearch 설치 경로로 들어갑니다. https://www.elastic.co/kr/download..

dogf.tistory.com

 

2) Kibana 설치하기

 

https://dogf.tistory.com/61

 

[kibana] 설치

Kibana 설치 방법에 대해 알아봅니다. Elastic의 데이터 시각화 도구 Kibana를 설치하는 방법을 알려드리겠습니다. 다운로드 링크 접속 > 파일 다운로드 > 압축해제 (끝) 먼저, Kibana 설치 경로로 들어갑

dogf.tistory.com

 

1. 설치하기

 

Nori를 설치하기 위해 다음 명령어를 칩니다.

./bin/elasticsearch-plugin install analysis-nori

실행하면, 로그가 쭉 나오고 빨간색으로 밑줄 쳐 있는 부분처럼

...

-> Installed analysis-nori

...

라고 나오고 뒤에 에러가 없으면 정상적으로 실행된 겁니다.

Nori 설치 완료

Nori 설치 완료되었습니다.

 

2. 확인하기

 

1) ElasticSearch 실행 하기

설치 완료 후, ElasticSearch를 실행합니다.

다음과 같이 나왔을 때 정상적으로 구동되고 있음을 확인할 수 있습니다.

실행하면, 로그가 쭉 나오고 빨간색으로 표시 부분처럼

...

[node-1] loaded plugin [analysis-nori]

...

라고 나오고 뒤에 에러가 없으면 정상적으로 실행된 겁니다.

 

2) Nori 사용 하기

 

Nori 테스트를 위해 다음과 같이 index를 생성해줍니다.

 

Nori를 활용하기 위해서는 다음과 같은 설정이 필요합니다.

 

Nori를 사용하기 위해서는 index의 settings 부분에 "tokenizer" 및 "analyzer" 값을 다음과 같이 수정합니다.

아울러, mappings 부분에서는 적용할 필드에 "analyzer"값을 설정해둔 "nori"로 설정하면 됩니다.

 

그리고, 비교를 위해 title 필드를 만들어 주었습니다.

 

PUT nori_test
{
  "settings": {
    "analysis" : {
      "analyzer": {
        "nori": {
          "type": "custom",
          "tokenizer": "nori_mixed"
        }
      }, 
      "tokenizer": {
        "nori_mixed": {
          "type": "nori_tokenizer",
          "decompound_mode": "mixed"
        }
      }
    }
  },
  "mappings": {
    "properties": {
      "nori_title" : {
        "type" : "text",
        "fields" : {
          "keyword" : {
            "type" : "keyword",
            "ignore_above" : 256
          }
        },
        "analyzer" : "nori"
      },
      "title" : {
        "type" : "text",
        "fields" : {
          "keyword" : {
            "type" : "keyword",
            "ignore_above" : 256
          }
        }
      }
    }
  }
}

 

analyzer를 테스트해봅니다.

 

#1. Nori 분석기 테스트

GET _analyze
{
  "text": ["아버지가 방에 들어가신다"],
  "analyzer": "nori"
}

#2. 기본 분석기 테스트

GET _analyze
{
  "text": ["아버지가 방에 들어가신다"]
}

 

테스트 결과는 다음과 같습니다.

 

#1. Nori 분석기 테스트 결과
{
  "tokens" : [
    {
      "token" : "아버지",
      "start_offset" : 0,
      "end_offset" : 3,
      "type" : "word",
      "position" : 0
    },
    {
      "token" : "방",
      "start_offset" : 5,
      "end_offset" : 6,
      "type" : "word",
      "position" : 2
    },
    {
      "token" : "들어가",
      "start_offset" : 8,
      "end_offset" : 11,
      "type" : "word",
      "position" : 4
    }
  ]
}

#2. 기본 분석기 테스트 결과
{
  "tokens" : [
    {
      "token" : "아버지가",
      "start_offset" : 0,
      "end_offset" : 4,
      "type" : "<HANGUL>",
      "position" : 0
    },
    {
      "token" : "방에",
      "start_offset" : 5,
      "end_offset" : 7,
      "type" : "<HANGUL>",
      "position" : 1
    },
    {
      "token" : "들어가신다",
      "start_offset" : 8,
      "end_offset" : 13,
      "type" : "<HANGUL>",
      "position" : 2
    }
  ]
}

1. Nori 분석기 테스트 결과의 경우 조사가 제외되어 나오는 반면, 

2. 기본 분석기 테스트 결과의 경우 조사를 포함하여 결과가 나왔습니다.

 

이는, filter를 추가적으로 설정하는 것으로 세팅이 가능합니다.

 

검색을 테스트 위해 다음과 같이 샘플 데이터를 추가해줍니다.

 

PUT nori_test/_doc/1
{
  "nori_title" : "아버지가 방에 들어가신다",
  "title" : "아버지가 방에 들어가신다"
}

PUT nori_test/_doc/2
{
  "nori_title" : "아버지",
  "title" : "아버지"  
}

PUT nori_test/_doc/3
{
  "nori_title" : "방",
  "title" : "방"
}

PUT nori_test/_doc/4
{
  "nori_title" : "들어가",
  "title" : "들어가"
}

 

마지막으로, match를 다음과 같이 쿼리를 구성하여 검색해봅니다.

#1. Nori 분석기 테스트 
GET nori_test/_search
{
  "query": {
    "match": {
      "nori_title": "아버지가 방에 들어가신다"
    }
  }
}

#2. 기본 분석기 테스트
GET nori_test/_search
{
  "query": {
    "match": {
      "title": "아버지가 방에 들어가신다"
    }
  }
}

 

수행 결과는 다음과 같습니다.

 

#1. Nori 분석기 테스트 결과

{
  "took" : 2,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 4,
      "relation" : "eq"
    },
    "max_score" : 6.2063766,
    "hits" : [
      {
        "_index" : "nori_test",
        "_type" : "_doc",
        "_id" : "1",
        "_score" : 6.2063766,
        "_source" : {
          "nori_title" : "아버지가 방에 들어가신다",
          "title" : "아버지가 방에 들어가신다"
        }
      },
      {
        "_index" : "nori_test",
        "_type" : "_doc",
        "_id" : "2",
        "_score" : 1.2180433,
        "_source" : {
          "nori_title" : "아버지",
          "title" : "아버지"
        }
      },
      {
        "_index" : "nori_test",
        "_type" : "_doc",
        "_id" : "3",
        "_score" : 1.2180433,
        "_source" : {
          "nori_title" : "방",
          "title" : "방"
        }
      },
      {
        "_index" : "nori_test",
        "_type" : "_doc",
        "_id" : "4",
        "_score" : 0.8285012,
        "_source" : {
          "nori_title" : "들어가",
          "title" : "들어가"
        }
      }
    ]
  }
}

#2. 기본 분석기 테스트 결과

{
  "took" : 1,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 1,
      "relation" : "eq"
    },
    "max_score" : 2.8339283,
    "hits" : [
      {
        "_index" : "nori_test",
        "_type" : "_doc",
        "_id" : "1",
        "_score" : 2.8339283,
        "_source" : {
          "nori_title" : "아버지가 방에 들어가신다",
          "title" : "아버지가 방에 들어가신다"
        }
      }
    ]
  }
}

 

샘플 데이터는 조사 없이 구성하여 추가해주어서, Nori 분석기 테스트 결과 "아버지", "방", "들어가" 등이 포함된 결과를 찾을 수 있었습니다.

 

이상입니다.

 

반응형

'Big Data > ElasticSearch' 카테고리의 다른 글

[ElasticSearch] ERROR bootstrap checks failed  (0) 2021.09.01
[ElasticSearch] Elastiknn 플러그인 설치 및 실행  (0) 2021.08.23
[ElasticSearch] 실행  (0) 2021.07.05
[ElasticSearch] 설치  (0) 2021.06.29
Elastic Search 소개  (0) 2020.01.23

댓글