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 용어
DatabaseCluster
TableIndex
RowDocument
ColumnField

3. 📄 매핑(Mapping) 개념과 _mapping의 역할

  • **매핑(mapping)**이란 인덱스 내 문서의 필드 구조와 타입을 정의한 것입니다.
  • 예를 들어 필드가 text인지 keyword인지, 날짜인지 숫자인지를 정의합니다.
  • RDB로 치면 테이블의 스키마(schema) 와 비슷한 개념입니다.

✅ 매핑 확인 방법

GET http://localhost:9200/contents/_mapping?pretty
  • 위 요청은 contents 인덱스의 매핑 정보를 확인하는 API입니다.

🔠 대표적인 필드 타입

필드 타입설명
text검색용 텍스트 (analyzer로 형태소 분석 가능)
keyword필터, 정렬, 집계용 문자열 (분석 불가)
integer정수형 숫자
float실수형 숫자
date날짜/시간 정보
booleantrue/false 값

✅ 정리 요약

항목설명
/contents인덱스 이름 (RDB의 테이블과 유사)
인덱스 구조클러스터 → 인덱스 → 문서 → 필드
매핑(Mapping)문서의 필드 구조 정의 (타입, 분석기 등)
_mapping API인덱스의 현재 매핑 정보를 확인하는 엔드포인트