[Elasticsearch] 기존 맵핑 필드 타입 변경하기 + reindex
이번 포스팅은 엘라스틱 서치 사용 중
존재하는 인덱스의 매핑 필드 타입을 변경하는
튜토리얼 입니다.
1. 문제 발생 및 파악
- 엘라스틱을 사용해 데이터를 적재한 뒤 검색 쿼리 도중 문제 발생
- 사용하려는 쿼리가 데이터의 타입과 맞지 않아 검색 할 수 없다는 내용을 담고있다.
- 즉, vector scoring 검색을 사용하는데, vector가 binary형태로 입력이 되어있어야 하는데 현재 text로 맵핑되어있음
2. 해결 방안
- 기본적으로 한번 지정된 데이터 타입은 변경이 불가능하다.
- 여기서 제시하는 방법은 다시 데이터를 적재하지 않고, 최대한 쉽게 원하는 타입의 맵핑으로 변경하는 방법
<새로운 인덱스 + 매핑 생성>
PUT /[새로운_인덱스_이름]
{
"settings" : {
"number_of_shards" : 1
},
"mappings" : {
# custom 맵핑 작성
}
}
- 기존에 데이터가 담긴 인덱스는 두고, 새로운 매핑을 가진 인덱스 패턴을 생성한다
< 엘라스틱의 reindex API 사용>
POST _reindex
{
"source": {
"index": "[기존인덱스이름]"
},
"dest": {
"index": "[새로운매핑을가진_인덱스이름]"
}
}
- 엘라스틱의 reindex API를 사용하여 새로운 인덱스로 데이터를 복사한다.
[Trouble Shooting]
reindex 시 document가 많아 오래걸리면 timeout error 가 발생한다.
그럴경우, 뒤에 파라미터로 ?wait_for_completion=false를 붙여주면, 중간에 타임아웃이 나지않고 reindex가 계속 진행된다.
< 기존 인덱스 삭제 >
DELETE [기존_인덱스_이름]
3. 엘라스틱에서 binary타입의 데이터 사용하는 방법
- 가장 중요한 엘라스틱 공식 문서 링크
https://www.elastic.co/guide/en/elasticsearch/reference/current/binary.html
[ 첫번 째 시도 ]
PUT [인덱스이름]
{
"mappings": {
"properties": {
"name": {
"type": "text"
},
"vector": {
"type": "binary"
}
}
}
}
- 위와 같이 인덱스 생성시 "vector"필드가 검색이 안되는 문제 발생
- 다시 공식 문서로 들어가 자세히 확인 후 binary 필드의 파라미터가 존재하는 사실을 발견
[ 두번 째 시도 ] : doc_value 파라미터 추가
PUT [인덱스이름]
{
"mappings": {
"properties": {
"name": {
"type": "text"
},
"vector": {
"type": "binary",
"doc_values": true
}
}
}
}
- 위와 같이 doc_value 파라미터를 true로 설정해줘야, 분류나 연산, 검색이 가능하다