Elasticsearch를 엔진으로 사용하는 검색 파트에서 업무를 맡고 있습니다.
운영에서 사용 중인 인덱스 mapping 정보에 copy_to 옵션에 대해 정리해보려고 합니다.
copy_to는 문서의 한 필드에 저장된 값을 다른 필드로 복사하는 옵션입니다.
사내에서는 copy_to 옵션을 가지고 두 가지 이유 때문에 사용 중에 있습니다.
상품 인덱스 맵핑 정보 일부입니다.
{
...
"model": {
"copy_to": [
"totalIndex",
"fullModel"
],
...
},
"brand": {
"copy_to": [
"totalIndex"
],
...
},
"productName": {
"copy_to": [
"totalIndex"
],
...
},
"totalIndex": {
"type": "text"
...
},
...
}
첫 번째로는 모델, 브랜드, 상품명, 메이커... 등 다양한 필드 정보를 totalIndex에 copy_to 옵션을 주어 totalIndex 한 필드를 가지고 검색 쿼리를 수행합니다.
여러 필드를 검색하는 것보다 적은 필드를 검색하여 검색 속도를 높일 수 있습니다.
(하나에 필드를 여러 필드에 복사도 가능합니다.)
상품 인덱스 맵핑 정보 일부입니다.
{
...
"modifyD": {
"copy_to": [
"manufactureD"
],
"type": "date"
},
"manufactureD": {
"type": "date",
"fields": {
"field": {
"type": "keyword"
}
}
},
"registerD": {
"type": "date",
"fields": {
"field": {
"type": "keyword"
}
}
}
...
}
두 번째는 다중 인덱스 조회에 사용하기 위해 copy_to를 사용하고 있습니다.
상품 정보가 타입에 따라 두 가지 인덱스로 나눠지는데 구성하는 필드가 다릅니다.
'No mapping found for [manufactureDate] in order to sort on'
다중 인덱스 검색에 정렬을 줄 때 인덱스 하나라도 정렬에 사용한 필드가 없다면 위와 같은 메시지를 발생합니다.
(필드가 없는 인덱스는 정렬되지 않습니다.)
위와 같은 이슈를 피하기 위해 copy_to 옵션으로 필드에 데이터를 채워주고 있습니다.
copy_to로 복사한 필드에 지정된 값은 _source에는 저장되지 않습니다.
위 인덱스 일부 맵핑 정보를 가지고 test 인덱스를 만들었습니다.
manufactureD필드에 modifyD copy_to 옵션을 주었습니다.
GET test/_search
"hits" : [
{
"_index" : "test",
"_type" : "_doc",
"_id" : "1",
"_score" : 1.0,
"_source" : {
"modifyD" : "20230811",
"registerD" : "20220101"
}
},
{
"_index" : "test",
"_type" : "_doc",
"_id" : "2",
"_score" : 1.0,
"_source" : {
"modifyD" : "20210105",
"registerD" : "20190102"
}
}
]
test 인덱스를 조회하면 아래와 같은 결과값이 나옵니다.
copy_to 된 manufactureD는 _source 필드에 없습니다.
_source 필드는 문서의 원본 json 데이터가 저장되는 공간이므로 불필요하게 복사된 데이터를 저장하지 않아 공간 절약과 검색 속도 향상에 도움이 됩니다.
(store 옵션을 주면 저장 가능, stored_fields로 데이터 확인 가능)
_source 필드에는 저장이 되지 않지만 역인덱스 구조에 저장되어 검색 시 활용됨.
검색식에 해당 필드를 사용하면 아래와 같은 결과를 받을 수 있습니다.
GET test/_search
{
"query": {
"match": {
"manufactureD": {
"query": "20210105"
}
}
}
}
"hits" : [
{
"_index" : "reindex-test-b",
"_type" : "_doc",
"_id" : "2",
"_score" : 1.0,
"_source" : {
"shopCode" : "T33222",
"modifyD" : "20210105",
"registerD" : "20190102"
}
}
역인덱스를 통해 해당 필드에 대한 검색을 빠르게 수행할 수 있습니다.
'ELK' 카테고리의 다른 글
Elasticsearch 롤링 배포 (0) | 2023.06.23 |
---|---|
Elasticsearch Reindex 성능 개선 (0) | 2023.06.12 |
Elasticsearch Scroll API, Search After 성능 비교 (0) | 2023.05.08 |
ElasticSearch Cluster 샤드 이동 후 노드 제거 (0) | 2022.11.21 |
Elasticsearch Translog 란? (0) | 2022.10.19 |