Elasticsearch 토큰화
Elasticsearch 한국어 토큰화에 바른 적용하기
Elasticsearch에서 한국어 검색 품질은 토큰화(analyzer) 에 달려 있습니다.
기본 내장 분석기인 nori는 빠르지만 신조어·고유명사·복합명사에서 오분석이 잦습니다.
바른의 형태소 분석을 색인 전처리 단계에 두면, 더 정확한 토큰으로 색인해 검색 정확도를 높일 수 있습니다.
문제 상황
- nori는 사용자 사전 관리가 까다롭고, 새 고유명사가 등장할 때마다 노드 재시작이 필요한 경우가 많습니다.
걸어서세계속으로같은 프로그램명이 엉뚱하게 쪼개져 검색에 걸리지 않습니다.- 띄어쓰기가 흐트러진 문서(
아름다운강산)는 토큰 경계가 어긋납니다.
플러그인을 쓰면 더 간단합니다
Elasticsearch 분석기로 바른을 직접 꽂는 플러그인이 있습니다. 색인 파이프라인을 따로 만들 필요가 없고, 색인할 때와 검색할 때 같은 분석기가 돌아 토큰 기준이 저절로 맞습니다.
아래 방식은 플러그인을 설치할 수 없는 환경(관리형 Elasticsearch 등)이나, 토큰을 만드는 규칙을 응용 프로그램에서 직접 정하고 싶을 때 씁니다.
바른을 어떻게 적용하나
색인 파이프라인에서 문서 본문을 바른으로 먼저 분석해 형태소 토큰 배열을 만들고,
이를 whitespace 또는 keyword 분석기로 그대로 색인합니다.
바른의 사용자 사전과 띄어쓰기 보정(auto_spacing)을 활용하면 nori보다 운영이 단순합니다.
graph TD
DOC[원문 문서] --> BAREUN[바른 형태소 분석];
BAREUN --> NORM[명사·용언 원형 토큰];
NORM --> ES[Elasticsearch 색인];
Q[검색 질의] --> BAREUN2[바른 분석];
BAREUN2 --> ES;
색인 토큰과 질의 토큰을 동일한 바른 분석기로 만들면, 색인-검색 양쪽의 토큰 기준이 일치해 매칭이 안정적입니다.
from bareunpy import Tagger
tagger = Tagger("koba-XXXX-...", "localhost")
def to_tokens(text: str):
"""본문을 색인용 토큰 배열로 변환합니다(명사 + 용언/형용사 원형)."""
res = tagger.tags([text])
tokens = res.nouns() # 체언
for morph, tag in res.pos():
if tag in ("VV", "VA"): # 동사·형용사 원형도 색인
tokens.append(morph)
return tokens
print(to_tokens("걸어서세계속으로 다시 방송됩니다."))
걸어서세계속으로를 사용자 사전의 고유명사 사전에 등록해 두면 하나의 토큰으로 유지됩니다.
결과와 이점
| 항목 | nori | 바른 적용 |
|---|---|---|
| 고유명사·신조어 | 사전 관리 번거로움 | 사용자 사전 실시간 갱신 |
| 복합명사 | 과분해 잦음 | 등재 시 유지 또는 의도대로 분해 |
| 띄어쓰기 오류 | 토큰 경계 어긋남 | auto_spacing 보정 후 토큰화 |
| 정확도 | 보통 | 품사 태깅 99.6% |
운영 팁
바른 사용자 사전은 파일 변경을 실시간으로 감지해 반영하므로, 사전을 바꿔도 서버 재시작이 필요 없습니다. 새 고유명사를 자주 추가하는 검색 서비스에 잘 맞습니다.
자주 묻는 질문
Q. nori를 완전히 대체해야 하나요?
상황에 따라 다릅니다. 정확도가 중요한 핵심 필드만 바른으로 전처리해 색인하고, 나머지는 nori를 쓰는 혼합 구성도 가능합니다.
Q. 색인과 검색 토큰 기준을 어떻게 맞추나요?
색인 시와 검색 시 같은 사용자 사전·같은 옵션으로 바른을 호출하면 됩니다.
질의도 tagger.tags()로 토큰화한 뒤 검색하세요.
Q. 실시간 색인 성능은 괜찮나요?
바른은 ONNX 런타임 기반으로 빠르게 추론합니다. 대량 색인은 문서를 배치로 묶어 tags([...])에
여러 문장을 한 번에 넘기면 처리량을 높일 수 있습니다.
Q. 바른과 Elasticsearch는 어떻게 연동하나요?
바른은 색인 파이프라인의 전처리 단계에 둡니다. 문서 본문을 바른으로 분석해 형태소 토큰 배열을 만든 뒤
whitespace나 keyword 분석기로 그대로 색인하고, 검색 질의도 같은 바른 분석기로 토큰화합니다.
REST로 호출할 때는 Connect 경로(POST /bareun.LanguageService/AnalyzeSyntax)를 사용하면 됩니다.
관련 문서
- 토큰화 API(Tokenize)와 형태소 분석의 차이 — 색인 토큰 설계에 도움
- 사용자 사전 시작하기 — 고유명사·신조어 등록 흐름
- 사용자 사전 실시간 반영(hot reload) — 재시작 없이 사전 갱신
- REST(HTTP+JSON)로 호출하기 — Connect 경로로 색인·검색 연동
도움이 되었나요?