환경
- OS: macOS m1
- ElasticSearch version: `8.16.2` (Docker Image: `elasticsearch:8.16.2`)
문제 발생
인덱싱하려는 JSON 파일
{"index": {"_id" : "1"}}
{"title": "Kubernetes: Up and Running", "reviews": 10, ...생략 }
{"index": {"_id" : "2"}}
{"title": "Cloud Native Java", "reviews": 33, ...생략 }
... 생략
인덱싱하려는 JSON 파일은 아래 ElasticSearch 공식 문서에 있는 형식을 지켰습니다.
공식 문서에 나와있는 입력 형태
action_and_meta_data\n
optional_source\n
action_and_meta_data\n
optional_source\n
....
action_and_meta_data\n
optional_source\n
다만 API 요청 예시는 아래처럼 인덱스가 명시되어 있습니다.
POST _bulk
{ "index" : { "_index" : "test", "_id" : "1" } }
{ "field1" : "value1" }
{ "delete" : { "_index" : "test", "_id" : "2" } }
{ "create" : { "_index" : "test", "_id" : "3" } }
{ "field1" : "value3" }
{ "update" : {"_id" : "1", "_index" : "test"} }
{ "doc" : {"field2" : "value2"} }
명령어
curl -H "Content-Type: application/json" -XPOST "localhost:9200/books/_doc/_bulk?pretty&refresh" --data-binary "@books.json"
명령어를 보면 `books`라는 인덱스에 `_doc` 타입으로 벌크 인덱싱을 수행하려고 합니다.
에러 발생
{
"error" : {
"root_cause" : [
{
"type" : "illegal_argument_exception",
"reason" : "Malformed content, found extra data after parsing: START_OBJECT"
}
],
"type" : "illegal_argument_exception",
"reason" : "Malformed content, found extra data after parsing: START_OBJECT"
},
"status" : 400
}
JSON 형식이 잘못되진 않은 것 같은데 이런 에러 응답을 반환 받았습니다.
해결 방법
방법 1. (간단한 방법)
URI에 타입을 제외하면 해결됩니다. (인덱스 `books` 뒤에 타입 부분 `_doc` 제거)
ElasticSearch 6.x 버전부터 인덱스는 단일 타입만 사용하고, 대부분 `_doc` 타입을 사용합니다.
AS-IS
curl -H "Content-Type: application/json" -XPOST "localhost:9200/books/_doc/_bulk?pretty&refresh" --data-binary "@books.json"
TO-BE
curl -H "Content-Type: application/json" -XPOST "localhost:9200/books/_bulk?pretty&refresh" --data-binary "@books.json"
방법 2. (귀찮은 방법)
아래 작업을 순서대로 수행하면 됩니다.
1. JSON에 인덱스를 추가
AS-IS
{"index": {"_id" : "1"}}
{"title": "Kubernetes: Up and Running", "reviews": 10, ...생략 }
{"index": {"_id" : "2"}}
{"title": "Cloud Native Java", "reviews": 33, ...생략 }
... 생략
TO-BE (인덱스 `books` 명시)
{"index": {"_index": "books", "_id" : "1"}}
{"title": "Kubernetes: Up and Running", "reviews": 10, ... 생략 }
{"index": {"_index": "books", "_id" : "2"}}
{"title": "Cloud Native Java", "reviews": 33, ... 생략 }
2. URI에 인덱스 부분을 제거
AS-IS
curl -H "Content-Type: application/json" -XPOST "localhost:9200/books/_doc/_bulk?pretty&refresh" --data-binary "@books.json"
TO-BE (명시한 인덱스 `books` 제거)
curl -H "Content-Type: application/json" -XPOST "localhost:9200/_doc/_bulk?pretty&refresh" --data-binary "@books.json"
'ElasticSearch' 카테고리의 다른 글
ElasticSearch 샤드 배치 방식 변경하기 (0) | 2025.01.03 |
---|---|
ElasticSearch 클러스터 설정 톺아보기 (0) | 2024.12.30 |
ElasticSearch 기본 개념 (0) | 2024.12.29 |