프로그래밍/Elasticsearch

[elastic search] mapping 데이터 수정을 위한 reindex

동네로봇 2021. 1. 21. 21:10

2020/12/22 - [프로그래밍/elastic search] - [elastic search] 정규식으로 string replace 하기(_update_by_query)

 

왜 mapping 데이터를 수정하는 단계까지 오게 되었는지는 이전 글을 확인!


text 타입의 데이터 필드를 date 타입으로 변경하고 싶은데, 이 필드만 update 쿼리를 통해서 date타입으로 바꿀 수는 없을까???^0^???

안됨.

 

아무리 찾아도 없다. 안된다..ㅠ

 

한 번 설정한 mapping을 변경하고자 한다면, 내가 원하는 데이터 타입으로 설정된 빈 테이블(index)를 하나 새로 생성한 뒤 기존의 테이블 테이터를 새 테이블에 그대로 옮겨담는 reindex 작업이 필요하다.

 

테이블 전체를 옮기는 것이기 때문에 데이터가 많이 쌓여 있다면 그만큼 중간에 데이터가 날아갈 수도 있는 위험이 있다. 위험 부담을 하기 싫다면 기존 테이블에 그냥 새로운 컬럼을 하나 추가하는 것을 추천.

 

어쨌든 현재 인덱스에 '2020.01.01' text 타입으로 저장되어 있는 데이터를 '2020-01-01'형식의 date 타입으로 저장을 하기 위해 일단 현재 인덱스의 데이터에서 '.' 을 '-' 로 바꿔주었다. 이후 해당 필드가 date 타입인 새로운 인덱스를 생성한 뒤, 기존의 데이터를 그대로 새로운 인덱스에 밀어넣어 주었다.

 

www.elastic.co/guide/en/elasticsearch/reference/current/docs-reindex.html

 

Reindex API | Elasticsearch Reference [7.10] | Elastic

Deprecated in 7.6. Sort in reindex is deprecated. Sorting in reindex was never guaranteed to index documents in order and prevents further development of reindex such as resilience and performance improvements. If used in combination with max_docs, conside

www.elastic.co

# reindexing 을 위한 쿼리
POST _reindex?wait_for_completion=false
{
  "source": {
    "index": "index-000001"
  },
  "dest" : {
    "index" : "index-000001_new"
  }
}

 

쿼리에서 wait_for_completion = false 이 부분은 실행한 쿼리가 다 처리가 될 때까지 기다릴 것인지, 아니면 비동기적으로 처리할 것인지를 설정하는 것이다. 

false 로 처리하면 비동기로 처리할 수 있다. 

 

비동기로 처리하는 reindex 쿼리를 날리면 고유 task 번호가 나오는데, 이 고유번호를 통해서 쿼리의 현재 진행 상황을 파악할 수 있다. 

GET _tasks/BAkEbEbURcSUv_NLp0cRTQ:1271118

이 reindex 작업을 통해 하나의 필드를 text 타입에서 date 타입으로 바꿀 수 있었다.