Basic
Basic 카테고리의 모든 포스트 - 한국어
2개의 포스트
⚙️Analyzer 커스터마이징 가이드
이 문서는 Elasticsearch에서 custom analyzer를 설계하고,
nori tokenizer
기반으로 불용어 제거, 품사 필터링, 동의어 처리 등을 적용하는 방법을 다룹니다.
1. ⚙️ analyzer 커스터마이징 개요
✅ custom analyzer란?
custom analyzer = tokenizer + 0개 이상의 filter
- tokenizer: 입력 텍스트를 토큰으로 분해
- filters: 토큰을 소문자화, 불용어 제거, 동의어 처리 등 후처리
2. 주요 filter 종류
필터 이름 | 설명 |
---|---|
lowercase | 모든 텍스트를 소문자로 변환 |
stop | 불용어(stopword) 제거 (는 , 이 , 가 등) |
synonym | 동의어 치환 (예: kakao => 카카오 ) |
nori_part_of_speech | 품사(POS) 필터링 (예: 접속사 제거) |
nori_readingform | 한자 → 발음으로 변환 |
3. 예시: nori 기반 커스텀 analyzer
PUT http://localhost:9200/custom-index
{
"settings": {
"analysis": {
"tokenizer": {
"my_nori_tokenizer": {
"type": "nori_tokenizer",
"decompound_mode": "mixed"
}
},
"filter": {
"my_pos_filter": {
"type": "nori_part_of_speech",
"stoptags": [ "E", "IC", "J", "MAG", "MAJ" ]
},
"my_stop_filter": {
"type": "stop",
"stopwords": [ "의", "가", "이", "은", "는" ]
},
"my_synonym_filter": {
"type": "synonym",
"synonyms": [
"카카오, kakao",
"네이버, naver"
]
}
},
"analyzer": {
"my_korean_analyzer": {
"type": "custom",
"tokenizer": "my_nori_tokenizer",
"filter": [
"lowercase",
"my_pos_filter",
"my_stop_filter",
"my_synonym_filter"
]
}
}
}
},
"mappings": {
"properties": {
"content": {
"type": "text",
"analyzer": "my_korean_analyzer"
}
}
}
}
4. 커스텀 analyzer 분석 테스트
POST http://localhost:9200/custom-index/_analyze
{
"analyzer": "my_korean_analyzer",
"text": "카카오의 새로운 서비스가 시작되었습니다."
}
📌 예상 결과 (필터 적용됨):
🔰기본 개념
이 문서는 Elasticsearch를 처음 접하는 사람들을 위해 인덱스, 매핑, 구조 등을 설명합니다.
예제 URL은http://localhost:9200/contents
기준입니다.
1. 📌 /contents
는 무엇인가?
http://localhost:9200/contents
에서contents
는 인덱스(index) 이름입니다.- Elasticsearch에서 인덱스는 문서들의 집합입니다.
- RDB로 비유하면 **테이블(table)**에 해당합니다.
2. 🧱 Elasticsearch 구조 요약
Elasticsearch는 다음과 같은 계층 구조로 되어 있습니다:
클러스터
└── indices (복수형, 여러 인덱스)
└── index (예: contents)
└── documents (JSON 형식 데이터)
└── fields (각 데이터의 속성)
RDB 용어 | Elasticsearch 용어 |
---|---|
Database | Cluster |
Table | Index |
Row | Document |
Column | Field |
3. 📄 매핑(Mapping) 개념과 _mapping
의 역할
- **매핑(mapping)**이란 인덱스 내 문서의 필드 구조와 타입을 정의한 것입니다.
- 예를 들어 필드가
text
인지keyword
인지, 날짜인지 숫자인지를 정의합니다. - RDB로 치면 테이블의 스키마(schema) 와 비슷한 개념입니다.
✅ 매핑 확인 방법
GET http://localhost:9200/contents/_mapping?pretty
- 위 요청은
contents
인덱스의 매핑 정보를 확인하는 API입니다.
🔠 대표적인 필드 타입
필드 타입 | 설명 |
---|---|
text | 검색용 텍스트 (analyzer로 형태소 분석 가능) |
keyword | 필터, 정렬, 집계용 문자열 (분석 불가) |
integer | 정수형 숫자 |
float | 실수형 숫자 |
date | 날짜/시간 정보 |
boolean | true/false 값 |
✅ 정리 요약
항목 | 설명 |
---|---|
/contents | 인덱스 이름 (RDB의 테이블과 유사) |
인덱스 구조 | 클러스터 → 인덱스 → 문서 → 필드 |
매핑(Mapping) | 문서의 필드 구조 정의 (타입, 분석기 등) |
_mapping API | 인덱스의 현재 매핑 정보를 확인하는 엔드포인트 |