본문 바로가기

프로젝트/고민

elasticsearch에 형태소 분석기 적용하기

앞으로 elasticsearch를 이용할 때 유용할 것 같아 형태소 분석기 적용 과정을 정리하고자 한다.

 

형태소 분석기란

여기 "나는 김치를 좋아한다" 라는 문장이 있다. elasticsearch에서 김치를 포함하는 문장을 검색한다면, 검색 결과가 나오지 않는다. elasticsearch는 영어 외의 like 검색을 띄워쓰기 단위로 하기 때문이다. 따라서 "김치를" 까지 검색을 해야 해당하는 문장이 검색된다.

이러한 상황에서 형태소 분석기를 이용하면 형태소 단위로 검색이 가능하다.

적용하기

1. 먼저 현재 elasticsearch가 설치된 경로에 형태소 분석기를 설치한다.

elasticserch에서 지원하는 대표적인 형태소 분석기인 nori를 설치했다.

$ bin/elasticsearch-plugin install analysis-nori

2. 설치 확인

다음의 curl 요청을 통해 nori가 설치 됐는지 확인 가능하다.

curl -X GET "localhost:9200/_cat/plugins?v&pretty"

3. 매핑

elasticserach는 인덱스 생성시 다시 매핑하는 것이 불가능하기 때문에 처음 생성할 때 noritokenizer로 매핑을 해준다.

PUT /articles
{
  "settings": {
    "analysis": {
      "analyzer": {
        "my_nori": {
          "type": "custom",
          "tokenizer": "nori_tokenizer",
          "filter": ["lowercase", "nori_readingform"]
        }
      }
    }
  },
  "mappings": {
    "properties": {
      "id": {
        "type": "long"
      },
      "category": {
        "type": "text"
      },
      "content": {
        "type": "text",
        "analyzer": "my_nori"
      },
      "paragraphs": {
        "type": "text",
        "analyzer": "my_nori"
      },
      "platform": {
        "type": "text"
      },
      "press": {
        "type": "text"
      },
      "reporter": {
        "type": "text"
      },
      "title": {
        "type": "text",
        "analyzer": "my_nori"
      }
    }
  }
}

4. 조회 결과 확인

키바나의 dev tool을 이용해 paragraphs 필드에 "인류"라는 키워드를 가진 기사를 검색했다.

 

nori를 적용했기 때문에 '의'라는 조사가 붙지 않아도 검색이 성공한 것을 확인할 수 있다.