메뉴 건너뛰기

개발강좌/정보

  • (2/3)한글형태소 분석기 nori 설치 & 인덱스/매핑 생성 - ELK Stack - Debian 9 [프레임워크/기타]
  • 공돌이
    조회 수: 21809, 2018.09.29 15:28:47
  • 이전 글에서 급하게 수정해서 올렸지만, 한글형태소 분석기는 최근에 새로나온 nori 를 이용하도록 하겠습니다.

     

    공식 플러그인인 만큼 설치는 장난아니게 쉬워졌습니다.

    참고로, Debian에서 서비스로 elasticsearch를 쓰는 경우 플러그인이나 실행파일 찾기 힘드실 수 있는데,

    /usr/share 폴더 안에 있습니다.아래는 플러그인 설치프로그램을 full-path를 줘서 실행시킨 예입니다. 귀찮으신 분은 걍 path에 걸어놓으셔도 되겠지요.

     

    1. 플러그인 설치

    #
    sudo /usr/share/elasticsearch/bin/elasticsearch-plugin install analysis-nori

    만약 플러그인을 삭제하시려면,

    #
    sudo /usr/share/elasticsearch/bin/elasticsearch-plugin remove analysis-nori

     

     

    2. index & mapping creation

     

    1. elasticsearch 에 nori 분석기가 적용된 새로운 인덱스를 매핑과 함께 만들어봅니다. 필요한 단어를 추가할 수 있도록 사용자사전도 정의하겠습니다.
      아래 예시 코드에서는 분석 시 세가지의 토크나이저 필터가 적용되어 있습니다.
      특정품사를 분석 시 제거하는 nori_part_of_speech, 한자를 한글로 변환시켜주는 nori_readingform, 그리고 대문자를 소문자로 변환시켜주는 lowercase 입니다. 노리 분석기의 토크나이저와 필터에 대한 자세한 내용은 엘라스틱서치 사이트의 문서를 참고해주세요 (
      https://www.elastic.co/guide/en/elasticsearch/plugins/6.4/analysis-nori-analyzer.html)
      품사제거필터는 stoptag로 지정을 한 부분이 제거되는 건데, 제가 한글지식이 낮다보니 뭐를 넣고 뭐를 빼야할지 잘 몰라서 웨비나에 나온 거 그대로 넣어뒀습니다..^^ 해보고 이상한거 있으면  빼고 새로 해봐야죠.
    • 참고로, 아래에서 fullsearch 라는 필드는 커스텀 필드로 일반 필드들을 다 합쳐서 concatenate 시킨 필드입니다. 엘라스틱서치 5.x 버전에서는 _all method로 전체필드 검색이 가능했으나, 6.x 대 부터는 _all 이 없어졌으므로, 검색이 필요한 전체필드를 검색하기 위해서 아래처럼 적용한 것입니다. 기존필드에 copy_to 를 이용해 커스텀필드에 concatenate 시킨다고 생각하면 될것 같아요.

     

     
    PUT /testindex/?pretty
    {
    "settings" : {
    "number_of_shards": 1,
    "number_of_replicas": 0,
    "index":{
    "analysis":{
    "analyzer":{
    "korean":{
    "filter":[
    "npos_filter",
      "nori_readingform",
    "lowercase"
      ],
      "tokenizer":"nori_user_dict"
    }
      },
    "tokenizer": {
      "nori_user_dict": {
      "mode":"MIXED",
      "type": "nori_tokenizer",
      "user_dictionary": "userdic_ko.txt"
    }
      },
      "filter":{
      "npos_filter": {
    "type": "nori_part_of_speech",
      "stoptags":[
      "E","IC","J","MAG","MM","SP","SSC",
      "SSO","SC","SE","XPN","XSA",
      "XSN","XSV","UNA","NA","VSV"
    ]
      }
      }
    }
    }
    },
    "mappings": {
    "doc":{
    "properties": {
        "uid": {
          "type": "long"
        },
        "category": {
          "properties": {
            "code":{
              "type":"keyword"
            },
            "name":{
              "type":"text",
              "copy_to": "fullsearch"
            }
          }
        },
        "keywords": {
          "type": "keyword",
          "copy_to": "fullsearch"
        },
        "description": {
          "type": "text",
          "analyzer": "korean",
          "copy_to": "fullsearch"
        },
        "created_at": {
          "type": "date"
        },
        "updated_at": {
          "type": "date"
        },
        "fullsearch": {
          "type":"text"
        }
      }
     
    }
    }
    }
     

    이 명령을 kibana dev console 에 입력하고 실행하면, 일단 오류가 뜹니다. 지정한 사용자 정의사전이 아직 존재하지 않기 때문이죠.
    디폴트값이 어느경로인지 오류메시지에 나오니 그 경로에 사용자 사전 명을 생성시켜주시면 됩니다.
    debian 서비스기준으로는 /etc/elasticsearch 가 디폴트 경로가 되고 사용자사전 명은 여기서는 userdic_ko.txt 이니까

     
    sudo touch /etc/elasticsearch/userdic_ko.txt

    이렇게 생성시켜주시면 되겠지요.

    파일을 생성해주신 후에 다시 명령을 실행시켜 주시거나, 아예 처음부터 사전파일 만든후에 인덱스생성해주셔도 됩니다.

    자 이제 인덱스만들고, 분석기 적용하고 매핑까지 했으니 데이터를 넣어야 겠지요.
    다음시간 (이번 강좌의 마지막) 에는 RDB(여기서는 MYSQL - 더 정확히는 MARIADB)에 있는 테이블을 Logstash를 이용해서 방금 만들어진 testindex에 넣어서 검색이 잘 되는지 확인해 보겠습니다.

     

댓글 0 ...

https://meisteruser.net/devflow/3641
번호
제목
닉네임
프레임워크/기타 공돌이 21809 2018.09.29
1 프레임워크/기타 공돌이 4823 2018.09.20
태그
위로