Elasticsearch 에서 자연어 처리 성능 향상을 위한 IK 분석기 구현 가이드

Elasticsearch 기본 분석기의 한계와 해결 방안

ELK 스택의 핵심 구성 요소인 Elasticsearch 는 기본적으로 제공되는 standard 또는 simple 분석기를 사용합니다. 이 방식은 영문 기반 텍스트에는 효과적이지만, 한글이나 중국어 등 비공백 분리가 어려운 언어를 처리할 때 한계가 존재합니다.

기본 분석기를 사용하여 텍스트를 토큰화해 보면 다음과 같이 글자 단위까지 세분되어 나뉘게 됩니다.

# 기본 분석기로 토큰 확인
curl -XGET 'http://es-cluster:9200/_analyze?pretty&analyzer=standard' -d '빅데이터 기술 연구'

결과를 확인하면 텍스트가 개별 문자 단위로 파싱됨을 알 수 있습니다. 이로 인해 전체 단어 단위의 검색 시 매칭되지 않는 문제가 발생합니다. 예를 들어 다음처럼 데이터를 저장하고 동일한 문구로 검색 요청을 보내면 결과가 반환되지 않습니다.

# 데이터 저장
curl -XPUT 'http://es-cluster:9200/news_index/article/1' -d '{"headline": "빅데이터 기술 연구"}'# 검색 시도
curl -XGET 'es-cluster:9200/news_index/article/_search?pretty' -d '{ "query": { "term": {"headline": "빅데이터 기술 연구"}}}'# 결과: hits count 0

이는 인덱싱 과정에서 단어가 잘게 쪼개졌기 때문에, 정확한 구문 (Term) 으로 조회했을 때 일치하는 도큐먼트를 찾지 못했기 때문입니다. 이를 해결하기 위해 한국어나 중국어를 지원하도록 설계된 IK 분석기 (IK Analyzer) 플러그인의 도입이 필요합니다.

IK 분석기 설치 및 구성

IK 분석기는 두 가지 주요 모드를 제공합니다.

  • ik_max_word: 가능한 한 미세하게 단어를 분리합니다. 최대 단어 조합을 생성하여 검색 범위 확대에 유리합니다.
  • ik_smart: 의미 있는 가장 큰 단위를 기준으로 단어를 분리합니다. 처리 속도가 빠르고 정확도는 높지만 일부 단어가 누락될 수 있습니다.

플러그인 설치 과정은 다음과 같습니다.

  1. 오픈소스 리포지토리를 통해 해당 Elasticsearch 버전과 호환되는 PKG 파일을 다운로드받습니다.
    wget https://github.com/meiqi/elasticsearch-analysis-ik/releases/download/v8.0.0/elasticsearch-analysis-ik-8.0.0.zip
  2. 압축ファイルを 해제 후 Elasticsearch 설치가 완료된 디렉토리의 plugins 경로 아래에 복사합니다.
    cp elasticsearch-analysis-ik-* /path/to/elasticsearch/plugins/analysis-ik
  3. 서비스 재시작을 통해 플러그인이 활성화되도록 합니다.
    systemctl restart elasticsearch

인덱스 매핑 정의 및 데이터 적재

새로운 인덱스를 생성할 때 매핑 단계에서 분석기를 명시적으로 지정해야 합니다. 여기서는 ik_max_word 를 사용하도록 설정합니다.

# 커스텀 분석기를 갖는 인덱스 생성
curl -XPUT 'http://es-cluster:9200/chinese_content?pretty' -d '{  "settings" : {    "analysis" : {      "analyzer" : {        "main_analyzer" : {          "type" : "custom",          "tokenizer" : "ik_max_word"        }      }    }  },  "mappings" : {    "properties" : {      "doc_title" : {        "type" : "text",        "analyzer" : "main_analyzer"      },      "created_at" : {        "type" : "date"      }    }  }}'

정리된 데이터를 일괄 업로드 (_bulk) 기능을 활용하여 저장합니다.

curl -XPOST 'http://es-cluster:9200/chinese_content/_bulk?pretty' -d '{ "index" : { "_id" : "1001" } }{"doc_title": "인공지능과 머신러닝의 차이점","created_at": "2023-10-01"}{ "index" : { "_id" : "1002" } }{"doc_title": "딥러닝 모델 최적화 기법","created_at": "2023-10-02"}{ "index" : { "_id" : "1003" } }{"doc_title": "검색 엔진 알고리즘 분석","created_at": "2023-10-03"}'

검색 기능 및 하이라이트 테스트

데이터가 정상적으로 토큰되었는지 검증하기 위해 복합적인 키워드로 검색을 수행하고, 관련 부분을 강조 표시 (Highlighting) 합니다.

curl -XPOST 'http://es-cluster:9200/chinese_content/_search?pretty' -d'{  "query": {    "match": {      "doc_title": "머신러닝 인공지능"    }  },  "highlight": {    "pre_tags": [""],    "post_tags": [""],    "fields": {      "doc_title": {}    }  }}'

정상 작동 시 검색 조건에 포함된 단어가 색인 된 문서 내에서 정확히 매칭되며, 하이라이트 태그가 감싸진 결과를 반환받아야 합니다.

사용자 정의 사전 관리 및 동적 업데이트

인터넷상의 신조어나 특정 업무 용어는 기본 사전에 포함되어 있지 않아 오분리 될 수 있습니다. 이를 보정하기 위해 확장 사전 파일을 직접 수정하거나 관리해야 합니다.

먼저 설정 파일 경로의 IKAnalyzer.cfg.xml 에 접근하여 사용자 사전 등록 상태를 확인합니다.

<?xml version="1.0" encoding="UTF-8"?>
<properties>
    <entry key="ext_dict">custom/user_words.txt</entry>
    <entry key="ext_stopwords">ext/stopwords.txt</entry>
</properties>

상대 경로에 위치한 텍스트 파일 (예: user_words.txt) 에 신규 단어를 줄바꿈마다 추가하고 Elasticsearch 를 재부팅하면 적용됩니다. 예를 들어 '클라우드 네이티브', '컨테이너' 등의 단어를 추가한 뒤 재시작을 거치면 해당 단어들이 하나의 토큰으로 인식됩니다.

다만, 위와 같은 파일 수정 방식은 서비스 중단 (Restart) 을 동반하므로 운영 환경에서는 권장되지 않을 수 있습니다. 실제 프로덕션에서는 재시작 없이 실시간으로 사전을 반영하는 '핫 업데이트 (Hot Update)' API 가 지원하는 방식을 사용하는 것이 효율적입니다. 이는 별도의 HTTP 인터페이스를 통해 워드 리스트를 전송하여 내부 메모리에 로드함으로써 다운타임 없이 분사 로직을 갱신하는 기법입니다.

태그: elasticsearch IK_Analyzer Full_Text_Search Search_Optimization NLP

5월 26일 17:24에 게시됨