Elasticsearch 인덱스 관리 - reindex 인덱스 재구성

6312 단어 elasticsearch
필드의 설정은 수정할 수 없습니다. 필드를 수정하려면 새 맵핑에 따라 인덱스를 만들고 데이터를 대량으로 조회해서bulkapi로 새 인덱스에 다시 써야 합니다.대량 조회를 할 때 scrollapi를 사용하고 다중 스레드를 병행하여 reindex 데이터를 보내는 것을 권장합니다. 매번 scroll은 지정된 날짜의 데이터를 조회하여 하나의 스레드에 제출하면 됩니다.
구체적인 작업 단계:
(1) 처음에dynamic mapping에 의존하여 데이터를 삽입했지만 조심하지 않아 2017-01-01과 같은 날짜 형식의 데이터가 있기 때문에 ES는 자동으로 이런 형식의field를date 형식으로 비추었다. 실제로 그는string 형식이어야 한다.이때 우리가hello라는 단어를 삽입하면 오류가 발생합니다. 왜냐하면 그는 기본적으로date 형식이기 때문입니다.
PUT /my_index/my_type/3
{
  "title" : "2017-01-01"
}

.결과
{
  "my_index": {
    "mappings": {
      "my_type": {
        "properties": {
          "title": {
            "type": "date"
          }
        }
      }
    }
  }
}

그 결과 ES의 dynamic mapping은 로그 형식의 문자열을 date 형식으로 자동으로 비추는 것으로 나타났다
(2) 색인에string 형식의 title 값을 넣으면 오류가 발생합니다
PUT /my_index/my_type/4
{
  "title" : "hello world"
}

결과 반환
{
  "error": {
    "root_cause": [
      {
        "type": "mapper_parsing_exception",
        "reason": "failed to parse [title]"
      }
    ],
    "type": "mapper_parsing_exception",
    "reason": "failed to parse [title]",
    "caused_by": {
      "type": "illegal_argument_exception",
      "reason": "Invalid format: \"hello world\""
    }
  },
  "status": 400
}

(3) 이때 타이틀의 유형을 수정하려면 불가능하다
PUT /my_index/_mapping/my_type
{
  "properties": {
    "title" : {
      "type": "text"
    }
  }
}

결과 반환
{
  "error": {
    "root_cause": [
      {
        "type": "illegal_argument_exception",
        "reason": "mapper [title] of different type, current_type [date], merged_type [text]"
      }
    ],
    "type": "illegal_argument_exception",
    "reason": "mapper [title] of different type, current_type [date], merged_type [text]"
  },
  "status": 400
}

결과:field가 생성되면 형식을 변경할 수 없습니다.
(4) 이때 유일한 방법은 reindex를 하는 것이다. 즉, 새로운 인덱스를 다시 만들고 낡은 인덱스의 데이터를 조회한 다음에 새로운 인덱스를 가져오는 것이다.
(5) 옛 색인 이름이 old_index, 새 색인 이름은 new_index, 터미널 자바 응용, 이미 old_ 사용 중index가 작동하고 있습니다. 온라인의java 응용 프로그램을 중지하고 사용자가 사용하고 있는 index를 new_로 수정해야 합니까?index, 자바 서비스 다시 시작합니까?이 과정에서 사용자가 훑어보고 있지만 갑자기 접근할 수 없는 상황이 발생할 수 있다.
(6) 그러니까 자바에게 별명을 적용하자. 이 별명은 낡은 색인을 가리키는 것이다. 자바 앱은 먼저 사용하고 자바 앱은 good_index alias가 조작합니다. 이때 실제 가리키는 것은 오래된 index(my_index)GET my_index/_mapping/my_type
이때 good를 찾아봅시다_index
GET /good_index/_search
{
  "query": {
    "match_all": {}
  }
}

반환 결과:
{
  "took": 4,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "failed": 0
  },
  "hits": {
    "total": 1,
    "max_score": 1,
    "hits": [
      {
        "_index": "my_index",
        "_type": "my_type",
        "_id": "3",
        "_score": 1,
        "_source": {
          "title": "2017-01-01"
        }
      }
    ]
  }
}

결과: 현재 good_index는 my_index의 별명, good_index가 my_를 가리켰습니다.index.
(7) 새 index, 제목 형식을string으로 조정
PUT /my_index_new
{
  "mappings": {
    "my_type" : {
      "properties": {
        "title" : {
          "type": "string"
        }
      }
    }
  }
}

(8) scrollapi로 데이터 대량 조회
GET /my_index/_search?scroll=1m
{
  "query": {
    "match_all": {}
  },
  "sort": ["_doc"],
  "size": 1
}

여기size:1, 우리가 그렇게 많은 데이터가 없기 때문이다.그래서 실제 장면은 수천 수만에 달할 수도 있고 자신의 데이터량을 볼 수도 있다.
결과 반환
{
  "_scroll_id": "DnF1ZXJ5VGhlbkZldGNoBQAAAAAAASFVFnJyRk9uQ0IzUndxS094YUlleUxuVXcAAAAAAAEhVhZyckZPbkNCM1J3cUtPeGFJZXlMblV3AAAAAAABIVcWcnJGT25DQjNSd3FLT3hhSWV5TG5VdwAAAAAAASFYFnJyRk9uQ0IzUndxS094YUlleUxuVXcAAAAAAAEhWRZyckZPbkNCM1J3cUtPeGFJZXlMblV3",
  "took": 2,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "failed": 0
  },
  "hits": {
    "total": 1,
    "max_score": null,
    "hits": [
      {
        "_index": "my_index",
        "_type": "my_type",
        "_id": "3",
        "_score": null,
        "_source": {
          "title": "2017-01-01"
        },
        "sort": [
          0
        ]
      }
    ]
  }
}

(9)bulkapi로 scroll에서 찾아낸 데이터를 대량으로 새 인덱스에 쓰기
POST /_bulk
{"index": {"_index" : "my_index_new", "_type" : "my_type", "_id" : "3"}}
{"title" : "2017-01-01"}

(10) 8~9회 반복해서 한 무더기 또 한 무더기의 데이터를 조회하고 bulkapi로 한 무더기의 데이터를 새 인덱스에 대량 기록한다
(11) goods_index alias my_로 전환index_new에 따르면 자바 응용 프로그램은 인덱스 별명을 통해 인덱스에 있는 데이터를 직접 사용합니다. 자바 응용 프로그램은 정지, 제로 제출, 고가용
POST /_aliases
{
  "actions" : [
    {"remove" : {"index" : "my_index", "alias" : "goods_index"}},
    {"add" : {"index" : "my_index_new", "alias" : "goods_index"}}
  ]
}

(12) 직접 goods_index 별명으로 ok 여부를 조회합니다PUT /my_index/_alias/good_index
결과 반환
{
  "took": 1,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "failed": 0
  },
  "hits": {
    "total": 1,
    "max_score": 1,
    "hits": [
      {
        "_index": "my_index_new",
        "_type": "my_type",
        "_id": "3",
        "_score": 1,
        "_source": {
          "title": "2017-01-01"
        }
      }
    ]
  }
}

큰일났다!!!
 

좋은 웹페이지 즐겨찾기