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

문제 상황

서비스의 상품 검색 기능에서 한글 검색 정확도가 떨어진다는 피드백이 계속 들어왔다. "노트북 가방"을 검색하면 "노트북"만 포함된 결과도 함께 나오고, "맥북"과 "맥북프로"가 제대로 구분되지 않는 문제가 있었다.

기존에는 Elasticsearch의 standard 분석기를 사용 중이었는데, 이는 공백 기반으로만 토큰을 분리하기 때문에 한글 처리에 한계가 있었다.

nori 분석기 도입

Elasticsearch 6.6부터 공식 제공되는 nori 플러그인을 적용하기로 했다. nori는 Lucene의 한글 형태소 분석기를 기반으로 한다.

# nori 플러그인 설치
bin/elasticsearch-plugin install analysis-nori

인덱스 설정에 custom analyzer를 추가했다.

{
  "settings": {
    "analysis": {
      "tokenizer": {
        "nori_user_dict": {
          "type": "nori_tokenizer",
          "decompound_mode": "mixed",
          "user_dictionary": "userdict_ko.txt"
        }
      },
      "analyzer": {
        "korean": {
          "type": "custom",
          "tokenizer": "nori_user_dict",
          "filter": ["nori_posfilter"]
        }
      },
      "filter": {
        "nori_posfilter": {
          "type": "nori_part_of_speech",
          "stoptags": ["E", "J", "SC", "SE"]
        }
      }
    }
  }
}

decompound_modemixed로 설정해서 복합명사를 원형과 분해형 모두 인덱싱하도록 했다. "맥북프로"를 검색하면 "맥북", "프로", "맥북프로" 모두 매칭된다.

사용자 사전 관리

도메인 특화 용어들은 사용자 사전에 등록했다. config/userdict_ko.txt 파일을 생성하고 브랜드명, 모델명 등을 추가했다.

맥북프로
갤럭시노트
에어팟프로

결과

재인덱싱 후 검색 테스트 결과, 한글 검색 정확도가 눈에 띄게 개선되었다. 특히 복합명사와 브랜드명 검색에서 오차가 크게 줄었다.

다만 사용자 사전은 수동 관리가 필요해서, 신규 상품 등록 시 사전 업데이트 프로세스를 함께 구축해야 했다. 이 부분은 추후 자동화를 검토할 예정이다.