Elasticsearch 한글 형태소 분석기 Nori 적용기

문제 상황

재택근무 전환 이후 사내 문서 검색 시스템의 사용량이 급증하면서 검색 품질 이슈가 많아졌다. 특히 한글 검색에서 "프론트엔드"를 검색했을 때 "프론트"만 포함된 문서도 함께 노출되는 문제가 발생했다. Elasticsearch 기본 standard analyzer는 한글을 단순히 공백 기준으로 분리하기 때문에 복합어 처리가 제대로 되지 않았다.

Nori 분석기 도입

Elasticsearch 6.6부터 공식 지원하는 Nori 플러그인을 적용하기로 결정했다. 설치는 간단했다.

bin/elasticsearch-plugin install analysis-nori

인덱스 설정에서 analyzer를 정의했다.

{
  "settings": {
    "analysis": {
      "analyzer": {
        "nori_analyzer": {
          "type": "custom",
          "tokenizer": "nori_tokenizer",
          "filter": ["nori_posfilter", "lowercase"]
        }
      },
      "filter": {
        "nori_posfilter": {
          "type": "nori_part_of_speech",
          "stoptags": ["E", "IC", "J", "MAG", "MM", "SP", "SSC", "SSO", "SC", "SE", "XPN", "XSA", "XSN", "XSV", "UNA", "NA", "VSV"]
        }
      }
    }
  }
}

사용자 사전 관리

우리 도메인의 전문 용어들이 잘못 분리되는 문제가 있었다. "데브옵스"가 "데브"와 "옵스"로 분리되는 경우였다. user_dictionary.txt 파일을 작성해 해결했다.

데브옵스
프론트엔드
백엔드
풀스택

tokenizer 설정에 사전을 추가했다.

{
  "tokenizer": {
    "nori_user_dict": {
      "type": "nori_tokenizer",
      "user_dictionary": "user_dictionary.txt"
    }
  }
}

결과

검색 정확도가 눈에 띄게 개선되었다. 특히 복합어 검색에서 오탐률이 40% 이상 감소했다. 다만 사용자 사전 관리를 위한 프로세스가 필요해졌고, 새로운 용어 추가 시 reindex가 필요하다는 운영 부담이 생겼다. 이 부분은 별도의 사전 관리 도구를 만들어 해결할 예정이다.