ELK 스택/Elasticsearch

[Elasticsearch] 기존 맵핑 필드 타입 변경하기 + reindex

new_challenge 2020. 2. 10. 18:35
반응형

이번 포스팅은 엘라스틱 서치 사용 중

존재하는 인덱스의 매핑 필드 타입을 변경하는

튜토리얼 입니다.

 

 

 

 

 

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가 계속 진행된다.

trouble shootin 발생화면

 

< 기존 인덱스 삭제 >

DELETE [기존_인덱스_이름]

 

 

3. 엘라스틱에서 binary타입의 데이터 사용하는 방법

- 가장 중요한 엘라스틱 공식 문서 링크

https://www.elastic.co/guide/en/elasticsearch/reference/current/binary.html 

 

Binary datatype | Elasticsearch Reference [7.5] | Elastic

The binary type accepts a binary value as a Base64 encoded string. The field is not stored by default and is not searchable: PUT my_index { "mappings": { "properties": { "name": { "type": "text" }, "blob": { "type": "binary" } } } } PUT my_index/_doc/1 { "

www.elastic.co

 

[ 첫번 째 시도 ]

PUT [인덱스이름]
{
  "mappings": {
    "properties": {
      "name": {
        "type": "text"
      },
      "vector": {
        "type": "binary"
      }
    }
  }
}

- 위와 같이 인덱스 생성시 "vector"필드가 검색이 안되는 문제 발생

- 다시 공식 문서로 들어가 자세히 확인 후 binary 필드의 파라미터가 존재하는 사실을 발견

 

바이너리 field의 파라미터

 

[ 두번 째 시도 ] : doc_value 파라미터 추가

PUT [인덱스이름]
{
  "mappings": {
    "properties": {
      "name": {
        "type": "text"
      },
      "vector": {
        "type": "binary",
        "doc_values": true
      }
    }
  }
}

- 위와 같이 doc_value 파라미터를 true로 설정해줘야, 분류나 연산, 검색이 가능하다

반응형