본문 바로가기
TIL/엘라스틱 서치

Elastic Search : Complete Guide to ElasticSearch - 리인덱싱

by yeon_zoo 2024. 1. 21.

[기존 매핑을 업데이트하기]

  • 일반적으로 업데이트 불가
    • 기존 도큐먼트들을 업데이트하는 게 문제가 있기 때문 (ex. 텍스트 값들은 이미 분석되어 있음)
    • 전체 데이터 구조를 다시 만들어야 할 수도 있음
    • 비어있는 인덱스여도 매핑을 업데이트하거나 삭제하는 건 불가함.
    • 방법은 새로운 인덱스로 옮기는 것 뿐..
  • “ignore_above” 옵션만 가능

 

[Reindex API]

  • 새로운 매핑과 인덱스를 PUT 해준다.
  • POST /_reindex API를 사용한다.

POST /_reindex

{
  "source": {
    "index": "reviews"
  },
  "dest": {
    "index": "reviews_new"
  }
}
  • 리인덱싱은 생각보다 자주 필요하다 (비즈니스 요구사항이 바뀔 수도 있고.. 저장 형태를 바꿔야 할 수도 있고..)
  • 데이터형은 실제 값이 어떻게 저장되었는지를 반영하지 않는다.
  • _source 는 저장 시점에 제공된 필드의 값을 가지고 있다. (따라서 저장 형태는 int -> string으로 바뀌었더라도 조회 결과를 보면 int 타입처럼 보일 수 있다)
    • 리인덱싱을 할 때 _source의 값도 바꿀 수 있다. -> 스크립트 예시가 있음
    • 혹은 앱 단에서 이를 해결할 수도 있다.
POST /_reindex
{
  "source": {
    "index": "reviews"
  },
  "dest": {
    "index": "reviews_new"
  },
  "script": {
    "source": """
      if (ctx._source.product_id != null) {
        ctx._source.product_id = ctx._source.product_id.toString();
      }
    """
  }
}
  • source안에 “query” 를 넣어 특정 도큐먼트들만 가져와서 리인덱싱 할 수 있다.

 

[필드 삭제]

  • 일반적으로 삭제될 수 없으므로 그냥 비어두면 된다.
  • 데이터 셋이 커지면 기존 도큐먼트들에 이 필드가 있는 것이 저장소를 먹을 수 있으니 삭제하는 게 가치 있을 수도 있다.
  • POST /reindex  source.source : [“content”, “created_at”] 이런식으로 옵션을 줘서 원하는 필드만 리인덱싱 가능
  • 필드 리네이밍은 스크립트를 통해서 가능하다.
    • _source는 자바의 해시맵이다. Remove를 하면 key를 삭제함과 동시에 value를 가져오므로 아래와 같은 할당이 가능
"script": {
  "source": """
   # Rename "content" field to "comment"
   ctx._source.comment = ctx._source.remove("content")
   """
}

 

[리인덱싱 특징]

  • 스크립트에 ctx.op를 사용하는 법
    • query 파라미터 내에서 ctx.op를 사용할 수 있다.
    • query 파라미터를 사용하는 게 퍼포먼스가 좋고 선호된다.
    • “noop” (리인덱싱을 하지 않음) 과 “delete” (dest 인덱스에 있으면 삭제 됨)은 다르다
  • 버전 충돌을 해결하는 파라미터 같은 것들이 더 있다.
    • 기본적으로 버전 충돌은 쿼리를 abort 시킴
  • 도큐먼트를 리인덱싱 하기 전에 source 인덱스의 스냅샷이 생성된다.
  • Reindex API는 배치에서도 수행된다.
    • Update by query, Delete by Query api 랑 유사
    • 내부적으로 Scorll API를 사용한다 -> 효율적으로 리인덱싱 가능
  • 성능 영향을 줄이기 위해 throttling 을 구성할 수 있다.
    • 프로덕션 클러스터에서 유용함

댓글