기존 매핑 필드 타입 변경하기 (reindex 활용)

이현우·2023년 11월 3일
0

엘라스틱서치

목록 보기
2/2

1. 문제 발생

ElasticSearch는 동적 매핑을 지원하기에 타입을 미리 정의하지 않아도 인덱스에 document를 추가하면 자동으로 매핑이 생성됩니다.
필드 매핑을 지정하지 않고 색인 지정 시 원하지 않는 타입 (keyword -> text)이 지정 될 수 있으므로 미리 매핑하는 것을 추천합니다.
이번에 색인 작업을 진행하다가 실수로 매핑을 하지 않고 진행하여 필드 타입을 변경할 일이 생겼습니다.

2. 관련 내용 확인

기본적으로 한번 지정된 데이터 타입은 변경이 불가능합니다.
기한이 정해져 있어 색인 시간이 너무 오래 걸리기에 데이터를 다시 적재하는 것은 불가능 하였습니다.

3. 해결 방안

이미 지정된 인덱스를 건드리는 것이 아닌 타입을 매핑한 인덱스를 새로 생성하여 옮기는 방향으로 생각했습니다.

  1. 새로운 인덱스 생성 + 매핑 생성
 PUT /[새로운_인덱스_이름]
{
    "settings" : {
        "number_of_shards" : 1
    },
    "mappings" : {
    	# custom 맵핑 작성
    }
}
  • 기존에 데이터가 담긴 인덱스는 남기고, 새로운 매핑을 가진 인덱스 패턴을 생성합니다.
POST _reindex
{
  "source": {
    "index": "[기존인덱스이름]"
  },
  "dest": {
    "index": "[새로운매핑을가진_인덱스이름]"
  }
}
  • 엘라스틱서치의 reindex API를 사용하여 새로운 인덱스로 데이터를 복사합니다.

※ 주의 사항
reindex시 document가 많아 오래걸리면 timeout error가 발생합니다.
그럴 경우 파라미터로 ?wait_for_completion=false를 붙여주면 중간에 타임아웃이 나지 않고 reindex가 계속 진행됩니다.

POST _reindex?wait_for_completion=false
{
  "source": {
    "index": "[기존인덱스이름]"
  },
  "dest": {
    "index": "[새로운매핑을가진_인덱스이름]"
  }
}
profile
GitHub - https://github.com/jenu8628

0개의 댓글