copy_to는 여러 필드의 값을 하나의 필드로 복사하여, 통합 검색을 가능하게 하는 Elasticsearch의 매핑 파라미터입니다.
_source에는 원본 필드만 저장됨copy_to 필드는 검색 전용 인덱스에만 존재match, term, query_string 등 모든 쿼리에서 사용 가능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"
}
}
}
}
POST /products/_doc/1
{
"title": "삼성 갤럭시 S24",
"description": "최신 플래그십 스마트폰",
"tags": ["스마트폰", "삼성", "5G"]
}
GET /products/_doc/1
응답:
{
"_source": {
"title": "삼성 갤럭시 S24",
"description": "최신 플래그십 스마트폰",
"tags": ["스마트폰", "삼성", "5G"]
// ❌ search_all 필드는 없음!
}
}
GET /products/_search
{
"query": {
"match": {
"search_all": "삼성"
}
}
}
결과: title, description, tags 중 "삼성"이 포함된 문서 모두 검색 ✅
{
"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"
}
}
}
}
// ❌ 이렇게 조회 불가능
GET /products/_search
{
"_source": ["search_all"]
}
// ✅ 원본 필드만 조회 가능
GET /products/_search
{
"_source": ["title", "description", "tags"]
}
// 원본 필드 업데이트하면 copy_to 필드도 자동 업데이트
POST /products/_update/1
{
"doc": {
"title": "삼성 갤럭시 S24 Ultra"
}
}
// search_all에도 자동 반영됨
copy_to 필드는 인덱스에 추가 저장 공간 사용copy_to 대상 필드의 analyzer가 적용됨{
"query": {
"match": {
"search_all": "삼성 갤럭시"
}
}
}
{
"query": {
"multi_match": {
"query": "삼성 갤럭시",
"fields": ["title^3", "description", "tags^2"]
}
}
}
| 구분 | copy_to | multi_match |
|---|---|---|
| 쿼리 속도 | ⭐⭐⭐⭐⭐ 빠름 | ⭐⭐⭐⭐ 보통 |
| 인덱스 크기 | ⭐⭐⭐ 큼 | ⭐⭐⭐⭐⭐ 작음 |
| 쿼리 복잡도 | ⭐⭐⭐⭐⭐ 간단 | ⭐⭐⭐ 복잡 |
| 필드별 가중치 | ❌ 불가능 | ✅ 가능 |
copy_to는 검색 전용 필드 - _source에 저장 안 됨