DB/데이터 관리

Elasticsearch > analyzer

dddzr 2026. 1. 25. 12:11

📌 1. settings / analysis / analyzer 개념

🔍 1-1. settings란?

  • 인덱스의 구성 설정을 정의하는 영역이다.
  • 샤드 수, 리플리카 수, 분석기(analyzer) 설정 등이 포함된다.

🔍 1-2. analysis란?

  • 텍스트 분석기 관련 설정 전부를 담는다.
  • 내부 구성:
    • analyzer
    • tokenizer
    • filter
    • char_filter

🔍 1-3. analyzer란?

  • 텍스트를 쿼리 시 또는 색인 시 “어떻게 쪼개고(normalizing) 처리할지”를 정의하는 도구이다.
  • 최소 구성 요소:
    • tokenizer (필수)
    • filter (선택)
    • char_filter (선택)

📌 2. analyzer는 필수인가?

analyzer를 반드시 설정해야 하는 것은 아니며, 기본 분석기만으로도 충분한 경우가 많다.

항목 필수 여부 설명
analyzer 설정 자체 ❌ 선택 설정하지 않으면 Elasticsearch 기본 분석기(standard analyzer)가 적용됨
tokenizer ✅ 필수 custom analyzer를 정의할 때 반드시 지정해야 함
filter ❌ 선택 필요 시 lowercase, stopword 등을 추가
char_filter ❌ 선택 HTML strip 등 전처리 용도

 

✔ analyzer가 필요한 경우

  • 한국어 검색 → ✔ 필수
  • 자동완성, 부분 검색 → ✔ 필수
  • 동의어(synonym) → ✔ 필수
  • 검색 정확도 높이기 (형태소, 불용어, 대소문자) → ✔ 필수
  • 특수 문자 기반 토큰 분리 → ✔ 필수

✔ analyzer가 필요 없는 경우

  • exact match(keyword) 필드
  • 단순 영어 검색 + 기본 기능으로 충분한 경우

📌 3. settings와 analyzer의 기본 구조

Elasticsearch 인덱스를 생성할 때 아래처럼 settingsanalyzer를 지정할 수 있다.

PUT /my_index

{

  "settings": {

    "analysis": {

      "analyzer": {

        "my_custom_analyzer": {

          "type": "custom",

          "tokenizer": "standard",

          "filter": [ "lowercase", "asciifolding" ]

        }

      }

    }

  },

  "mappings": {

    "properties": {

      "message": {

        "type": "text",

        "analyzer": "my_custom_analyzer"

      }

    }

  }

}

 


📌 4. 주요 구성 요소 설명

🔍 analyzer

사용자 정의 분석기(custom) 또는 기본 분석기를 의미한다.

🔍 tokenizer (필수)

텍스트를 쪼개는 기준이다.

  • standard
  • whitespace
  • ngram
  • nori_tokenizer (한국어 형태소 분석기)

🔍 filter

토큰에 대한 후처리를 진행한다.

  • lowercase
  • asciifolding
  • nori_part_of_speech
  • stop (불용어 제거)


📖 예제 1: 영어용 소문자 분석기

"analyzer": {

  "my_lowercase_analyzer": {

    "type": "custom",

    "tokenizer": "standard",

    "filter": ["lowercase"]

  }

}

 

📖 예제 2: 한글용 nori 분석기

"analyzer": {

  "korean_analyzer": {

    "type": "custom",

    "tokenizer": "nori_tokenizer",

    "filter": ["nori_part_of_speech"]

  }

}

 


📌 5. analyzer를 필드에 적용하는 법 (mapping)

"mappings": {

  "properties": {

    "title": {

      "type": "text",

      "analyzer": "my_custom_analyzer"

    }

  }

}

 

⚠️ analyzer를 정의해도 mapping에서 지정하지 않으면 적용되지 않는다.


📌 6. analyzer 테스트 방법

설정이 잘 되었는지 확인하려면 _analyze API를 호출!

POST /my_index/_analyze

{

  "analyzer": "my_custom_analyzer",

  "text": "Hello WORLD!"

}

 


📌 7. analyzer 수정

analyzer는 생성 후 수정 불가!

❌ 왜 수정이 불가능한가?

  • analyzer는 인덱스 생성 시 Lucene 구조로 고정됨.
  • 중간에 기준을 바꾸면 기존 문서의 분석 기준과 신규 문서 기준이 달라짐


📌 8. analyzer 수정이 필요한 경우는?

  • 기존 인덱스를 복사해서 새로 만드는 방식

1️⃣ 새 인덱스를 원하는 설정으로 생성
2️⃣ 기존 인덱스에서 데이터 가져오기 (reindex API)
3️⃣ 기존 인덱스 삭제 (선택)
4️⃣ 별칭(alias)을 바꿔서 기존 인덱스처럼 사용

 

1️⃣ 새 인덱스 생성

PUT /my_index_v2

{

  "settings": {

    "analysis": {

      "analyzer": {

        "my_custom_analyzer": {

          "type": "custom",

          "tokenizer": "standard",

          "filter": ["lowercase"]

        }

      }

    }

  },

  "mappings": {

    "properties": {

      "title": {

        "type": "text",

        "analyzer": "my_custom_analyzer"

      }

    }

  }

}

 

2️⃣ 데이터 복사 (reindex)

POST /_reindex

{

  "source": { "index": "my_index" },

  "dest":   { "index": "my_index_v2" }

}

 

3️⃣ alias 전환

POST /_aliases

{

  "actions": [

    { "remove": { "index": "my_index",    "alias": "current_index" }},

    { "add":    { "index": "my_index_v2", "alias": "current_index" }}

  ]

}

 


📌 9. Spring Boot에서 analyzer 매핑하는 법

✅9-1. 도메인 클래스

  • Spring Data Elasticsearch는 @Document@Field 어노테이션 기준으로 매핑을 잡아줌.
  • @Field(analyzer = "my_custom_analyzer") 를 반드시 명시해야 커스텀 analyzer 사용됨.
@Document(indexName = "article_index")
public class Article {

    @Id
    private String id;

    @Field(type = FieldType.Text, analyzer = "my_custom_analyzer")
    private String title;

    @Field(type = FieldType.Text)
    private String content;

}

 

9-2. ElasticsearchRepository 작성

  • findByXXX() 자동 쿼리 or @Query 커스텀 사용
  • 복잡한 구현에선 repository 안 쓰고 ElasticsearchClient 직접 호출해서 쓸 수도 있다.
public interface ArticleRepository extends ElasticsearchRepository<Article, String> {

    List<Article> findByTitle(String title);

    @Query("{ \"match\": { \"title\": \"?0\" } }")
    List<Article> findByCustomTitle(String title);

}

9-3. 검색 테스트

@Autowired
private ArticleRepository articleRepository;
public void testSearch() {
    List<Article> articles = articleRepository.findByTitle("hello world");
    articles.forEach(System.out::println);
}


'DB > 데이터 관리' 카테고리의 다른 글

개인 식별 정보 암호화 방법  (0) 2026.01.25
CTE(Common Table Expression)란?  (0) 2025.11.29
Elasticsearch란?  (0) 2025.04.10
JDBC / SQL Mapper / ORM (JPA, Hibernate, MyBatis)  (0) 2024.09.25