최근 프로젝트에서 Elasticsearch에 Bulk data를 넣는 일을 하고 있는데, 하면서 생긴 trouble issue를 정리한다.
elasticsearch하시는분은 아시겠지만 이것보다 좋은 방법이 있었죠...또륵
발생 오류
{"error":{"root_cause":[{"type":"json_e_o_f_exception","reason":"Unexpected end-of-input: expected close marker for Object (start marker at [Source: (ByteArrayInputStream); line: 1, column: 1])\n at [Source: (ByteArrayInputStream); line: 1, column: 2]"}],"type":"json_e_o_f_exception","reason":"Unexpected end-of-input: expected close marker for Object (start marker at [Source: (ByteArrayInputStream); line: 1, column: 1])\n at [Source: (ByteArrayInputStream); line: 1, column: 2]"},"status":400}
여러 강의들을 참고하며 Bulk 예시를 보고 형태를 맞춰 넣기로 생각함
{index:~~~} {내용~~~}
형식의 JSON 파일을 만들면 되는구나!bulk로 POST한다면 JSON의 형태가 아닌 줄을 맞춰줘야한다...!
index_not_found_exception
/n
빈 한줄을 넣어줘야한다.How to Index Elasticsearch Documents with the Bulk API in Python
Python의 API를 이용해 JSON 형태를 만들지 않고도 DataFrame or list 째로 보낼 수 있다^_^.......
# elasticsearch의 helpers import
from elasticsearch import Elasticsearch, helpers
# ES에 벌크로 보낼 데이터를 담을 리스트
docs = []
# 리스트에 데이터 넣음
for num in range(10):
docs.append({
'_index': '인텍스 이름',
'_source': {
"category": "test"
"c_key": "test"
"status": "test"
"price": 1111
}
})
# helpers.bulk 함수를 통해 bulk 데이터 ES에 input..
helpers.bulk(es, docs)
헤헤...
왜 이제 봤을까...ㅎㅎ
무튼 내일 이걸로 해서 시도해봐야겠다. 이방법이면 AWS lambda 함수를 이용해서 배치로 넣어주면 바로 ES 저장까지 할 수 있지않을까?