📌 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 인덱스를 생성할 때 아래처럼 settings와 analyzer를 지정할 수 있다.
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 |