copy_to란?
Elasitcsearch의 index에는 여러 필드들이 존재합니다. copy_to는 여러 필드의 값을 그룹으로 묶어 하나의 필드로 검색할 수 있는 기능을 제공하는 것입니다. Elasticsearch 공식 문서에서는 first name과 last name을 예시를 들어 두 필드를 하나의 full name이라는 필드로 copy_to 하여 full name 하나의 필드만으로 first name과 last name을 모두 검색이 가능하도록 하였습니다. 이렇게 copy_to를 이용하면 검색을 할 때 "피트"라는 사람이 "피트"가 first name인지 last name인지 명확하게 알지 못할 때 검색이 유용할 뿐만 아니라 여러 필드를 자주 검색할 때 쿼리에 여러 필드를 검색하는 것보다 하나의 copy_to 필드를 검색하는 것이 검색 속도 향상에도 많은 도움이 된다고 합니다.
copy_to 사용해보기
Elasticsearch 공식 문서에서는 first name, last name을 예시로 들었지만 저 같은 경우 Elasticsearch를 로그를 저장하고 분석하는데 많이 사용하기 때문에 App name, Service name을 예시로 사용해 보겠습니다.
my-log 인덱스 필드 타입
필드명 | 타입 |
app | keyword |
service | keyword |
app_service | keyword |
level | keyword |
message | text |
my-log 인덱스 생성
curl -X PUT http://localhost:9200/my-log -H 'Content-Type: application/json' -d '
{
"mappings": {
"properties": {
"app": {
"type": "keyword",
"copy_to": "app_service"
},
"service": {
"type": "keyword",
"copy_to": "app_service"
},
"app_service": {
"type": "keyword"
},
"level": {
"type": "keyword"
},
"message": {
"type": "text"
}
}
}
}
'
데이터는 아래와 같이 넣어줬습니다.
{"app":"payment", "service":"api_server", "level": "debug", "message": "A payment was successful"}
{"app":"payment", "service":"api_server", "level": "debug", "message": "B payment was successful"}
{"app":"client", "service":"server", "level": "debug", "message": "client connected"}
이제 app_service라는 필드 하나만으로 payment를 검색하여 2개의 데이터가 출력되는지 확인합니다.
curl -X POST http://localhost:9200/my-log/_search -H 'Content-Type: application/json' -d '
{
"query": {
"match": {
"app_service": {
"query": "payment"
}
}
}
}
'
출력결과
{
"took": 43,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 2,
"relation": "eq"
},
"max_score": 0.5908618,
"hits": [
{
"_index": "my-log",
"_id": "1",
"_score": 0.5908618,
"_source": {
"app": "payment",
"service": "api_server",
"level": "debug",
"message": "A payment was successful"
}
},
{
"_index": "my-log",
"_id": "2",
"_score": 0.5908618,
"_source": {
"app": "payment",
"service": "api_server",
"level": "debug",
"message": "B payment was successful"
}
}
]
}
}
위에서 설명했던 것과 같이 여러 필드를 검색 조건에 전부 기입하는 것 보다 이렇게 copy_to를 이용하면 개발자 입장에서 보다 간편하고 검색 성능을 높을 수 있습니다. copy_to를 잘 활용만 한다면 상황에 따라 개발하는데 많은 도움이 될 것 같습니다.
참고
https://www.elastic.co/guide/en/elasticsearch/reference/current/copy-to.html
'Elasticsearch > Elasticsearch 데이터' 카테고리의 다른 글
Elasticsearch Aggregations#4 Sub Aggregations (0) | 2021.09.19 |
---|---|
Elasticsearch Aggregations#3 terms, ranges, histogram, date_range (0) | 2021.09.17 |
Elasticsearch Aggregations#2 cardinality, percentiles, percentile_ranks (0) | 2021.09.15 |
Elasticsearch Aggregations#1 min, max, sum, avg, stats (0) | 2021.09.13 |
Elasticsearch 검색하기#3 match, term, range 쿼리 (0) | 2021.09.10 |