본문으로 바로가기

Elasticsearch copy_to 활용

category ELK 2023. 5. 26. 16:55
반응형

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"
    }
  }

역인덱스를 통해 해당 필드에 대한 검색을 빠르게 수행할 수 있습니다.

반응형