728x90
problem
"action_request_validation_exception"
"Validation Failed: 1: type is missing;"
두 예외에 대한 설명도 아래에 담는다
폐쇄망(내부망)에서 엘라스틱서치 인덱스의 데이터를 옮기려고 한다
해당 인덱스의 데이터를 json 파일로 받아 다시 새로운 인덱스로 옮기는 작업을 했다.
solution
1. 데이터 -> JSON 파일 추출
# 1. 첫 번째 요청으로 스크롤 ID 얻기
curl -X GET "http://localhost:9200/index/_search?scroll=1m&size=1000" -H 'Content-Type: application/json' -d'
{
"query": {
"match_all": {}
}
}' > my_index.json
# 2. 스크롤 ID 추출
SCROLL_ID=$(jq -r '._scroll_id' my_index.json)
# 3. 반복적으로 스크롤 ID를 사용하여 다음 배치의 데이터를 가져오기
while [ "$(jq '.hits.hits | length' my_index.json)" -gt 0 ]; do
curl -X GET "http://localhost:9200/_search/scroll" -H 'Content-Type: application/json' -d"
{
\"scroll\": \"1m\",
\"scroll_id\": \"$SCROLL_ID\"
}" >> my_index.json
SCROLL_ID=$(jq -r '._scroll_id' my_index_first_batch.json)
done
위 스크립트는 1000개 이상의 데이터가 있을 시 배치를 사용하여 데이터를 쓰는 작업이다
데이터가 1000개 이하라면 1번 작업만 수행하면 된다.
스크롤이란 ?
대량의 데이터를 배치처리로 순차적으로 도와주는 기능이다.
페이징 이랑 비슷하지만 다른 기능이다.
스크롤은 요청 순간 데이터가 변해도 요청이 끝날때 까지 데이터 또는 데이터 위치는 변하지 않는다.
2. json 파일 데이터 정재
//python 스크립트
import json
# 기존 데이터 파일 경로와 변환된 데이터 파일 경로
input_file = 'input.json'
output_file = 'bulk_data.json'
target_index = 'ts_admin'
# 데이터 읽기
with open(input_file, 'r') as f:
data = json.load(f)
# bulk 데이터 준비
bulk_data = []
for doc in data['hits']['hits']:
action = { "index": { "_index": target_index, "_id": doc['_id'],"_type":"doc" } }
bulk_data.append(action)
bulk_data.append(doc['_source'])
# bulk_data.json 파일로 저장
with open(output_file, 'w') as f:
for entry in bulk_data:
f.write(json.dumps(entry) + '\n')
bulk API 를 사용하려면 데이터를 양식에 맞게 작성 해야한다
create, update, delete 기능은 해당 키워드 안에 curly brace 묶어 요청을 보내야 한다.
curly brace 안에는 _index (원하는 인덱스) , _id (원하는 id) 를 지정하여 기능을 수행할 수 있다.
index 와 create 의 경우에는 "field" 키워드가 필요하다.
{ "index" : { "_index" : "test", "_id" : "1" } }
{ "field1" : "value1" }
UPDATE
update 의 경우에는 필드에 "doc" 키워드를 넣어주어야 한다.
{ "index" : { "_index" : "test", "_id" : "1" ,"_type":"doc"} }
{ "field1" : "value1" }
"_type"을 넣지 않으면
action_request_validation_exception
예외가 발생한다.
728x90
'개-발 > Infra' 카테고리의 다른 글
[AWS] aws ElastiCache cache 서버Redis 구성하기 (0) | 2024.06.27 |
---|---|
[AWS S3] 특정 확장자 업로드 방지 (0) | 2024.05.31 |
[ElasticSearch] SpringBoot 3.x elasticsearch 8.x 연동 ( with.Kotlin ) (0) | 2024.05.06 |
[ElsticSearch] 엘라스틱서치 개념과 Query (0) | 2024.04.09 |
[Redis] 선착순 이벤트 구현 레디스 분산락 (Redisson DistributeLock) (0) | 2024.03.03 |