Elasticsearch 7.x 검색 결과 정확도 개선 - 형태소 분석기 적용기

문제 상황

운영 중인 커머스 서비스에서 상품 검색 관련 CS가 늘어났다. '노트북 가방'을 검색했는데 '노트북'만 포함된 결과가 나오거나, '운동화'를 검색했는데 '운동'이 들어간 전혀 다른 상품이 상위에 노출되는 문제였다.

기존에는 Elasticsearch의 standard analyzer를 사용하고 있었는데, 한글 처리에는 적합하지 않았다. 공백 기준으로만 토큰을 나누다 보니 의미 단위 분리가 제대로 되지 않았다.

Nori 분석기 도입

Elasticsearch 6.6부터 공식 지원하는 nori 분석기를 적용하기로 했다. 루씬의 한글 형태소 분석기를 기반으로 하며, 별도 플러그인 설치 없이 사용 가능했다.

{
  "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", "lowercase"]
        }
      },
      "filter": {
        "nori_posfilter": {
          "type": "nori_part_of_speech",
          "stoptags": ["E", "J", "SC", "SE", "SF"]
        }
      }
    }
  }
}

사용자 사전 관리

도메인 특화 용어들이 제대로 토큰화되지 않는 문제가 있었다. 브랜드명이나 신조어의 경우 사용자 사전에 등록해야 했다.

나이키
아디다스
맥북프로

인덱스 재생성 시 userdict_ko.txt 파일을 참조하도록 설정했다. 신규 용어는 주 단위로 검토해서 추가하는 프로세스를 만들었다.

결과

재색인 후 검색 품질이 눈에 띄게 개선됐다. '노트북 가방' 검색 시 두 키워드가 모두 포함된 결과가 상위에 노출되고, 동의어 처리도 정확해졌다.

다만 초기 인덱스 구축 시간이 약 30% 증가했고, 사용자 사전 관리 포인트가 생겼다. 하지만 검색 품질 개선 효과를 생각하면 충분히 감수할 만한 트레이드오프였다.

다음 단계로는 동의어 사전 구축과 검색어 로그 분석을 통한 지속적인 개선을 계획 중이다.