728x90
엘라스틱서치에서 한글 문서를 효율적으로 검색하게 하려면 한글 형태소 분석기를 활용해 직접 분석기를 구성해야 한다. 한글 같은 경우 다른 언어와 달리 조사나 어미의 접미사가 명사, 동사 등과 결합하기 때문에 형태소 분석하는 과정이 어렵다. 엘라스틱서치는 사용 가능한 한글 형태소 분석기로는 상용 제품도 있고, 오픈소스로 공개된 것들도 있다.
은전한닢 형태소 분석기
설치 방법
/bin/elasticsearch-plugin install https://github.com/javacafe-project/elastic-book-etc/raw/master/plugin/elasticsearch-analysis-seunjeon-6.4.3.zip
사용 방법
PUT /seunjeon_default_analyzer
{
"settings": {
"number_of_shards": 5,
"number_of_replicas": 1,
"analysis": {
"analyzer": {
"korean": {
"type": "custom",
"tokenizer": "seunjeon_default_tokenizer"
}
},
"tokenizer": {
"seunjeon_default_tokenizer": {
"type": "seunjeon_tokenizer",
"index_eojeol": false,
"user_words": [
"낄끼+빠빠,-100",
"c1l+||+",
"어그로",
"버카충",
"abc마트"
]
}
}
}
}
}
- Mecab-ko-dic 기반으로 만들어진 기반으로 만들어진 한국어 형태소 분석기로 자바 인터페이스와 스칼라 인터페이스의 두 종류를 제공한다.
- 시스템 사전에 등록돼 있는 사전을 기반으로 동작하며, 복합명사와 활용어의 원형 찾기가 가능하다.
- tokenizer 설정을 통해 은전 한닢 플러그인에서 제공하는 seunjeon_tokenizer를 활성화하고, analyzer 설정을 통해 형태소 분석기를 정의하고 사용하면 된다.
분석기에서 제공하는 옵션 정보
| 파라미터 | 설명 |
| user_words | 사용자 사전을 정의한다(기본값: []) |
| user_dict_path | 사용자 사전 파일의 경로를 정의한다. 해당 파일은 엘라스틱서치의 config 폴더 밑에 생성한다. |
| decompoud | 복합명사 분해 여부를 정의한다(기본값: true) |
| deinflect | 활용어의 원형을 추출한다(기본값: true) |
| index_eojeol | 어절을 추출한다(기본값: true) |
| index_poses | 추출할 품사를 정의한다 - UNK : 알 수 없는 단어 - EP : 선어말어미 - E : 어미 - I : 독립언 - J : 관계언/조사 - M: 수식언 - N: 체언 - S: 부호 - SL: 외국어 - SH: 한자 - SN: 숫자 - V: 용언 - VCP: 긍정지정사 - XP: 접두사 - XS:접미사 - XR: 어근 |
| pos_tagging | 품사 태깅 여부를 정의한다(키워드에 품사가 붙어져서 나온다, 기본값: true) |
| max_unk_length | Unknown 품사 태깅의 키워드로 뽑을 수 있는 최대 길이를 정의한다(기본값: 8) |
사전 추가
PUT /seunjeon_with_dic_analyzer
{
"settings": {
"analysis": {
"tokenizer": {
"seunjeon_default_tokenizer": {
"type": "seunjeon_tokenizer",
"index_eojeol": false,
"pos_tagging": false,
"user_dict_path": "dic/user_dic.csv"
}
},
"analyzer": {
"korean": {
"type": "custom",
"tokenizer": "seunjeon_default_tokenizer",
"filter": [
"lowercase"
]
}
}
}
}
}
사용자 사전
삼성전자, -100
삼성, -50
전자, -50
- 은전 한닢은 사용자 사전을 통해 복합 명사(다수의 단어를 하나로 합쳐서 하나의 단어처럼 사용하는 것) 문제를 해결한다.
- 사용자 사전 위치는 인덱스를 생성한 후 settings에 사용자 사전의 경로를 지정하면 된다(user_dict_path)
- 사용자 사전은 엘라스틱서치 서버가 설치된 디렉터리의 config 디렉터리 안에 dic 아래로 생성하면 된다.
- 사용자 사전은 Term과 가중치 형태로 구성돼 있으며 가중치의 값이 작을수록 그에 따른 우선순위는 높아진다.
Nori 형태소 분석기
PUT nori_analyzer/_settings
{
"index": {
"analysis": {
"analyzer": {
"nori_stoptags_analyzer": {
"type": "custom",
"tokenizer": "nori_tokenizer",
"filter": [
"nori_posfilter"
]
}
},
"filter": {
"nori_posfilter": {
"type": "nori_part_of_speech",
"stoptags": [
"E",
"IC",
"MAG",
"MAJ",
"MM",
"NA",
"NR",
"SC",
"SE",
"SF",
"SH",
"SL",
"SN",
"SP",
"SSC",
"SSO",
"SY",
"UNA",
"UNKNOWN",
"VA",
"VCN",
"VCP",
"VSV",
"VX",
"XPN",
"XR",
"XSA",
"XSN",
"XSV"
]
}
}
}
}
}
- nori_part_of_speech 토큰 필터는 품사 태그 세트와 일치하는 토큰을 찾아 제거하는 토큰 필터이다.
- 문서에 존재하는 모든 명사를 역생인으로 생성하는 것이 아닌, 역색인될 명사를 선택적으로 고를 수 있다(사용하고 싶은 않은 형태소 제거 가능)
- 해당 토큰 필터는 stoptags라는 파라미터를 제공하며, 분리된 토큰에서 제거할 특정 형태소를 지정하는 것이 가능하다.
stoptags에 사용할 수 있는 파라미터 값
| 파라미터 | |
| E | 조사 (예: 은/는, 이/가, 을/를 등) |
| IC | 감탄사 |
| J | 접사 |
| MAG | 일반 부사 |
| MAJ | 접속 부사 |
| MM | 관형사 |
| NA | 분석 불능 품사 |
| NR | 수사(숫자) |
| SC | 구두점(쉼표, 마침표) |
| SE | 줄임표 (…) |
| SF | 마침표/물음표/느낌표 |
| SH | 한자 |
| SL | 외국어 (영어 등) |
| SN | 숫자 |
| SP | 공백 |
| SSC | 닫는 괄호 |
| SSO | 여는 괄호 |
| SY | 기호 |
| UNA | 불명확 |
| UNKNOWN | 알 수 없는 품사 |
| VA | 형용사 |
| VCN | 부정형 형용사 |
| VCP | 긍정형 형용사 |
| VSV | 서술격 조사 |
| VV | 동사 |
| VX | 보조 동사 |
| XPN | 접두사 |
| XR | 어근 |
| XSA | 형용사 파생 접미사 |
| XSN | 명사 파생 접미사 |
| XSV | 동사 파생 접미사 |
nori_readingform 토큰 필터
PUT nori_readingform
{
"settings": {
"index": {
"analysis": {
"analyzer": {
"nori_readingform_analyzer": {
"type": "custom",
"tokenizer": "nori_tokenizer",
"filter": ["nori_readingform"]
}
}
}
}
}
}
- 문서에 존재하는 한자를 한글로 변경하는 역할을 하는 필터
트위터 형태소 분석기


- 트위터에서 한글을 처리하기 위해 개발한 형태소 분석기(2017년 이후 오픈소스로 개발)
- 한글 형태소 분석 및 스테밍이 가능하며, 정규화, 토큰화, 스테밍, 어구 추출이 가능하다.
- 형태소 분석기에 사용되는 사전은 open-korean-text 프로젝트에서 별도로 제공된다.
정규화: 입니닼ㅋㅋ
- 입니다 ㅋㅋ
토큰화: 한국어를 처리하는 예시입니다 ㅋㅋ
- 한국어 → [한국어, Noun]
- 를 → [를, Josa]
- 처리 → [처리, Noun]
- 하 → [하, Verb]
- 는 → [는, Eomi]
- 예시 → [예시, Noun]
- 입니다 → [입니다, Adjective]
스테밍 : 한국어를 처리하는 예시입니다 ㅋㅋ
- 한국어 → [한국어, Noun]
- 를 → [를, Josa]
- 처리 → [처리, Noun]
- 하 → [하, Verb]
- 는 → [는, Eomi]
- 예시 → [예시, Noun]
- 입니다 → [이다, Adjective]
- ㅋㅋ → [ㅋㅋ, Unknown] (이모티콘/의성어라 별도 처리됨)
어구 추출: 한국어를 처리하는 예시입니다 ㅋㅋ
- 한국어
- 처리
- 예시
- 처리하는 예시
플러그인 설치
/bin/elasticsearch-plugin install https://github.com/javacafe-project/elastic-book-etc/raw/master/plugin/elasticsearch-analysis-openkoreantext-6.4.3.0-plugin.zip
사전 추가
삼성전자
애플
아이폰
갤럭시
사전 외의 단어를 사용자가 직접 추가할 수 있다.(plugins/elasticsearch-analysis-openkoreantext/dic)
인덱스 설정
PUT /openkoreantext_analyzer
{
"settings": {
"index": {
"analysis": {
"analyzer": {
"openkoreantext-analyzer": {
"tokenizer": "openkoreantext-tokenizer",
"char_filter": ["openkoreantext-normalizer"],
"filter": [
"openkoreantext-stemmer",
"openkoreantext-redundant-filter",
"lowercase"
]
}
}
}
}
}
}
- 플러그인 컴포넌트는 Character Filter, Tokenizer Filter, Analyzer로 구성돼 있다.
- 기본적으로 트위터 토크나이저를 사용해 토큰을 불리하며, openkoreantext-stemmer, openkoreantext-redundant-filter를 거쳐서 형용사나 동사를 스테밍하고 불필요한 단어를 제거하는 동작을 수행한다.
- Character Filter
- openkoreantext-normalizer 구어체를 표준화 한다.
- Tokenizer
- openkoreantext-tokenizer 문장을 토큰화한다.
- Token Filter
- openkoreantext-stemmer: 형용사, 동사를 스테밍 한다
- openkoreantext-redundant-filter: 접속사, 공백, 조사, 마침표 등을 제거한다.
- openkoreantext-phrase-extrator: 어구를 추출한다
728x90
'Elastic Search' 카테고리의 다른 글
| Ch06. 고급 검색 - 스크립팅을 이용해 동적으로 필드 추가하기 (0) | 2025.09.24 |
|---|---|
| Ch06. 고급 검색 - 검색 결과 하이라이트하기 (0) | 2025.09.24 |
| Ch05. 데이터 집계 - 근사값으로 제공되는 집계 연산 (0) | 2025.09.18 |
| Ch05. 데이터 집계 - 파이프라인 집계 (0) | 2025.09.18 |
| Ch05. 데이터 집계 - 버킷 집계 (0) | 2025.09.18 |