Elasticsearch copy_to 필드 완벽 가이드

dev-sj·2025년 11월 28일

📌 copy_to란?

copy_to는 여러 필드의 값을 하나의 필드로 복사하여, 통합 검색을 가능하게 하는 Elasticsearch의 매핑 파라미터입니다.

🔑 핵심 특징

✅ copy_to 필드는 _source에 저장되지 않습니다

  • _source에는 원본 필드만 저장됨
  • copy_to 필드는 검색 전용 인덱스에만 존재
  • 응답에서 직접 조회 불가능

✅ 검색 시에만 사용 가능

  • match, term, query_string 등 모든 쿼리에서 사용 가능
  • 여러 필드를 한 번에 검색할 때 유용

💡 사용 예시

1. 기본 설정

PUT /products
{
  "mappings": {
    "properties": {
      "title": {
        "type": "text",
        "copy_to": "search_all"
      },
      "description": {
        "type": "text",
        "copy_to": "search_all"
      },
      "tags": {
        "type": "keyword",
        "copy_to": "search_all"
      },
      "search_all": {
        "type": "text"
      }
    }
  }
}

2. 문서 인덱싱

POST /products/_doc/1
{
  "title": "삼성 갤럭시 S24",
  "description": "최신 플래그십 스마트폰",
  "tags": ["스마트폰", "삼성", "5G"]
}

3. _source 확인

GET /products/_doc/1

응답:

{
  "_source": {
    "title": "삼성 갤럭시 S24",
    "description": "최신 플래그십 스마트폰",
    "tags": ["스마트폰", "삼성", "5G"]
    // ❌ search_all 필드는 없음!
  }
}

4. 검색 시 사용

GET /products/_search
{
  "query": {
    "match": {
      "search_all": "삼성"
    }
  }
}

결과: title, description, tags 중 "삼성"이 포함된 문서 모두 검색 ✅


🎯 실전 활용 사례

자동완성 (Autocomplete)

{
  "mappings": {
    "properties": {
      "title": {
        "type": "text",
        "copy_to": "autocomplete_field"
      },
      "tags": {
        "type": "keyword",
        "copy_to": "autocomplete_field"
      },
      "autocomplete_field": {
        "type": "text",
        "analyzer": "standard"
      }
    }
  }
}

검색 쿼리:

{
  "query": {
    "match": {
      "autocomplete_field": "갤럭시"
    }
  }
}

다국어 검색

{
  "mappings": {
    "properties": {
      "title_ko": {
        "type": "text",
        "analyzer": "nori",
        "copy_to": "all_languages"
      },
      "title_en": {
        "type": "text",
        "analyzer": "english",
        "copy_to": "all_languages"
      },
      "all_languages": {
        "type": "text",
        "analyzer": "standard"
      }
    }
  }
}

⚠️ 주의사항

1. _source에 저장 안 됨

// ❌ 이렇게 조회 불가능
GET /products/_search
{
  "_source": ["search_all"]
}

// ✅ 원본 필드만 조회 가능
GET /products/_search
{
  "_source": ["title", "description", "tags"]
}

2. 업데이트 시 자동 반영

// 원본 필드 업데이트하면 copy_to 필드도 자동 업데이트
POST /products/_update/1
{
  "doc": {
    "title": "삼성 갤럭시 S24 Ultra"
  }
}
// search_all에도 자동 반영됨

3. 저장 공간 주의

  • copy_to 필드는 인덱스에 추가 저장 공간 사용
  • 너무 많은 필드를 복사하면 인덱스 크기 증가

4. 분석기(Analyzer) 설정

  • copy_to 대상 필드의 analyzer가 적용됨
  • 원본 필드의 analyzer는 무시됨

🆚 copy_to vs multi_match

copy_to 사용

{
  "query": {
    "match": {
      "search_all": "삼성 갤럭시"
    }
  }
}
  • 장점: 쿼리 간단, 성능 우수
  • 단점: 인덱스 크기 증가, 필드별 가중치 불가

multi_match 사용

{
  "query": {
    "multi_match": {
      "query": "삼성 갤럭시",
      "fields": ["title^3", "description", "tags^2"]
    }
  }
}
  • 장점: 필드별 가중치 설정 가능, 저장 공간 절약
  • 단점: 쿼리 복잡, 약간 느림

📊 성능 비교

구분copy_tomulti_match
쿼리 속도⭐⭐⭐⭐⭐ 빠름⭐⭐⭐⭐ 보통
인덱스 크기⭐⭐⭐ 큼⭐⭐⭐⭐⭐ 작음
쿼리 복잡도⭐⭐⭐⭐⭐ 간단⭐⭐⭐ 복잡
필드별 가중치❌ 불가능✅ 가능

✅ 권장 사용 시나리오

copy_to 사용 추천

  • 자동완성, 통합 검색
  • 필드별 가중치가 필요 없는 경우
  • 쿼리 성능이 중요한 경우

multi_match 사용 추천

  • 필드별 가중치 설정이 필요한 경우
  • 인덱스 크기를 최소화해야 하는 경우
  • 검색 로직을 유연하게 변경해야 하는 경우

🎓 요약

  1. copy_to는 검색 전용 필드 - _source에 저장 안 됨
  2. 여러 필드를 하나로 통합 검색 - 쿼리 단순화
  3. 자동으로 동기화 - 원본 업데이트 시 자동 반영
  4. 성능 vs 유연성 - 상황에 맞게 선택

📚 참고 자료

profile
IT 블로그 채널입니다!!

0개의 댓글