
엘라스틱서치에서 기존의 인덱스 매핑을 수정하고, 수정된 매핑을 가진 새로운 인덱스에 기존 데이터를 재색인(reindex)하게 된다.
GET 인덱스명/_mapping
을 입력하여 기존 인덱스의 매핑정보를 불러온다.

"mappings": {} 안의 매핑정보를 복사하여

원하는 매핑을 수정해준 후 PUT 명령어로 수정한 매핑을 가진 새로운 인덱스를 만든다.

POST _reindex
{
"source": {
"index": "기존 인덱스"
},
"dest": {
"index": "새로운 인덱스"
}
}
를 사용하여 재색인을 하게된다.
하지만!
기존 데이터의 수가 적다면 재색인 시간이 오래 걸리지 않을것이다. 그런데 데이터가 몇억개라면?
최대한 시간을 줄이는게(재색인 속도를 높히는게) 좋을것이다.
PUT test_reindex/_settings
{
"number_of_replicas": 0,
"refresh_interval": "0s"
}
엘라스틱서치 인덱스는 기본적으로 1개의 프라이머리샤드와 1개의 레플리카 샤드가 생성된다. 재색인을 할 때에 레플리카 샤드까지 작업하지 않는다면 재색인 속도가 높아진다. 또한 재색인시에는 세그먼트를 만들 필요도 없기 때문에 새로고침을 0초로 설정하면 속도가 향상된다. 그러므로 재색인 전에 인덱스에_settings 를 사용하여 레플리카 샤드와 새로고침 주기를 설정하여 재색인 속도를 향상시킬 수 있다.
(다만 재색인이 끝난 후에는 다시 기본 설정인 1, 1s로 되돌려줘야한다.)
재색인 작업을 병렬처리 할 수 있도록 설정할 수 있다. reindex api에서 slices 옵션을 사용하면 병렬로 작업할 수를 결정한다.
POST _reindex?wait_for_completion=false&slices=auto
{
"source": {
"index": "test_index"
},
"dest": {
"index": "test_reindex"
}
}
**작업해야할 데이터가 많을 때 wait_for_completion=false를 사용하지 않으면 키바나가 중간에 작업을 멈추게 된다. wait_for_completion을 false로 하여 비동기로 작업을 해야한다.
병렬작업은 샤드 갯수와 같을 때 성능이 가장 높다고 한다. 그래서 slices=auto로 하게되면 자동으로 샤드 갯수와 같게 병렬처리를 한다. 공식문서에 따르면 slices를 샤드 갯수보다 더 높게 설정하면 일반적으로 효율성이 떨어진다는데, 몇가지 테스트를 해보니 꼭 그렇지는 않은 것 같다. 데이터의 크기나 타입이나 여러 조건에 따라 다르긴 하겠지만, slices를 샤드 수보다 조금 높게(예를들어 기본 샤드가 1개일때 slices를 6으로 설정)했을 때 재색인 속도가 더 높았다.
그래서 재색인시에 slices수를 조정해보며 최적화된 재색인 속도를 찾아갈 수 있긴 하지만 만약 해야할 작업이 많다면 그냥 slices=auto로 설정하는게 일반적인 것 같다.