bulk API 수행 시 'Malformed content, found extra data after parsing: START_OBJECT' 에러 해결하는 방법

2024. 12. 26. 23:53·ElasticSearch

환경

- 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 역 인덱스(Inverted Index)  (0) 2025.01.10
ElasticSearch Cluester API & Index API - 클러스터 설정과 인덱스 설정 변경하기  (0) 2025.01.10
ElasticSearch 샤드 배치 방식 변경하기  (2) 2025.01.03
ElasticSearch 클러스터 설정 톺아보기  (0) 2024.12.30
ElasticSearch 기본 개념  (0) 2024.12.29
'ElasticSearch' 카테고리의 다른 글
  • ElasticSearch Cluester API & Index API - 클러스터 설정과 인덱스 설정 변경하기
  • ElasticSearch 샤드 배치 방식 변경하기
  • ElasticSearch 클러스터 설정 톺아보기
  • ElasticSearch 기본 개념
옐리yelly
옐리yelly
전시회에서 도슨트를 따라다니며 작품 해설을 들으면 더 재밌었던 기억들이 있습니다. 글로 더 재밌는 개발이 되도록 노력하고 있습니다.
  • 옐리yelly
    개발 갤러리
    옐리yelly
  • 전체
    오늘
    어제
    • 모든 글 보기 (82)
      • Project (22)
      • Java (4)
      • Spring (6)
      • Kubernetes (6)
      • Docker (2)
      • JPA (2)
      • Querydsl (2)
      • MySQL (8)
      • ElasticSearch (7)
      • DevOps (4)
      • Message Broker (3)
      • Git & GitHub (2)
      • Svelte (1)
      • Python (8)
        • Python Distilled (4)
        • Anaconda (1)
        • Django (0)
        • pandas (3)
      • Algorithm (1)
      • Computer Science (0)
      • 내 생각 (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    Message Broker
    docker
    Python
    Project
    blue-green 배포
    데드락
    MySQL
    JPA
    프로젝트
    dataframe
    gitops
    예약 시스템
    elasticsearch
    nks
    Spring
    커넥션 풀
    ncloud
    RabbitMQ
    리팩토링
    k8s
    비사이드
    svelte
    pandas
    argocd
    querydsl
    pymysql
    성능 테스트
    OOP
    포텐데이
    devops
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
옐리yelly
bulk API 수행 시 'Malformed content, found extra data after parsing: START_OBJECT' 에러 해결하는 방법
상단으로

티스토리툴바