Elasticsearch로 JSON 파일 가져 오기 / 인덱싱


89

저는 Elasticsearch를 처음 사용하며 지금까지 데이터를 수동으로 입력했습니다. 예를 들어 다음과 같은 작업을 수행했습니다.

$ curl -XPUT 'http://localhost:9200/twitter/tweet/1' -d '{
    "user" : "kimchy",
    "post_date" : "2009-11-15T14:12:12",
    "message" : "trying out Elastic Search"
}'

이제 .json 파일이 있으며이 파일을 Elasticsearch로 인덱싱하고 싶습니다. 나도 이와 같은 것을 시도했지만 성공하지 못했습니다.

curl -XPOST 'http://jfblouvmlxecs01:9200/test/test/1' -d lane.json

.json 파일을 어떻게 가져 옵니까? 매핑이 올바른지 확인하기 위해 먼저 수행해야하는 단계가 있습니까?


답변:


89

curl과 함께 파일을 사용하려는 경우 올바른 명령은 다음과 같습니다.

curl -XPOST 'http://jfblouvmlxecs01:9200/test/_doc/1' -d @lane.json

Elasticsearch는 스키마가 없으므로 반드시 매핑이 필요하지 않습니다. json을있는 그대로 보내고 기본 매핑을 사용하면 모든 필드가 표준 분석기를 사용하여 인덱싱되고 분석됩니다 .

명령 줄을 통해 Elasticsearch와 상호 작용하려면 curl보다 약간 더 편리한 elasticshell 을 살펴 보는 것이 좋습니다.

2019-07-10 : 사용자 지정 매핑 유형 은 더 이상 사용되지 않으며 사용해서는 안됩니다. 위의 URL에있는 유형을 업데이트하여 "test"라는 이름을 가진 유형이 혼란 스러웠 기 때문에 색인과 유형을 쉽게 확인할 수 있도록했습니다.


1
나는 나를 위해 일하지 않는다. 내가 당신의 명령을 입력 할 때 콘솔은 어떤 데이터도 제공하지 않는다.
콘라드

2
@Konrad 당신 jfblouvmlxecs01localhost, 맞습니까?
Ehtesh Choudhury 2014

2
clwen- "@"는 curl에게 json 파일에서 데이터를로드하도록 지시합니다.
Oliver

1
안녕하세요 저는 또한 탄력적 검색에 새로운 사람입니다. 누구나 이러한 .json 파일을 저장할 위치를 알려주세요.
swaheed

2
json 파일을 어디에 저장합니까?
AV94

26

현재 문서에 따라 https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-bulk.html :

curl에 텍스트 파일 입력을 제공하는 경우 일반 -d 대신 --data-binary 플래그를 사용해야합니다. 후자는 개행을 보존하지 않습니다.

예:

$ curl -s -XPOST localhost:9200/_bulk --data-binary @requests

1
_bulk load json 파일은 유효한 json 파일이 아닙니다. 구문은 _bulk API 링크에 제공됩니다. 또한이 예에 표시된대로 _id를 제공 할 필요가 없습니다. _id가 생략되면 자동 생성 된 _id가 제공됩니다.
Steve Tarver

17

우리는 이런 유형의 도구를 만들었습니다 https://github.com/taskrabbit/elasticsearch-dump


6
주어진 예는 여기에서 묻는 질문을 다루지 않습니다. json 파일을 입력으로, 탄력적 검색 URL을 출력으로 제공하면 작동합니까?
jgr0

색인을 json으로 내보내는 데 이것을 사용하고 있습니다. 감사.
Krishna Chaitanya Gopaluni

다음 명령을 사용하십시오. elasticdump --input=/path/to/file.json --output=http://'username:password'@localhost:9200/indexname --type=data. 'username:password@'필요하지 않은 경우 제거하십시오 .
Krishna Chaitanya Gopaluni

11

나는 elasticsearch_loader의 저자입니다
.이 정확한 문제에 대해 ESL을 작성했습니다.

pip로 다운로드 할 수 있습니다.

pip install elasticsearch-loader

그런 다음 다음을 실행하여 json 파일을 elasticsearch에로드 할 수 있습니다.

elasticsearch_loader --index incidents --type incident json file1.json file2.json

이거 좋은데! index모든 문서 앞에 필수 줄을 추가합니다 .
dr0i

2018-10-04 11 : 51 : 40.395741 오류 시도 [1/1] 예외가 발생했습니다. 영구적 인 데이터 손실입니다. 더 이상 재 시도하지 않습니다. 2018-10-04 11 : 51 : 40.395741 경고 청크 0에 예외가 발생했습니다 (ConnectionTimeout 원인 -ReadTimeoutError (HTTPConnectionPool (host = 'localhost', port = 9200) : read timed out. (read timeout = 10.0))) while processing
Chiel

작동하지 않는다는 사실 외에도 URL과 포트를 어디에서 지정합니까?
Chiel

elasticsearch_loader --help전체 도움말 메시지를 보려면 GitHub 페이지를 방문하거나 실행할 수 있습니다 . 다음을 사용하여 host : port를 지정할 수 있습니다.--es-host http://hostname:port
MosheZada 2010 년

좋은. 이 제외 --typeElasticsearch 6 버전에서 유형을 제거으로 중복된다 elastic.co/guide/en/elasticsearch/reference/6.0/...
블라드 T.

8

KenH의 답변에 추가

$ curl -s -XPOST localhost:9200/_bulk --data-binary @requests

당신은 대체 할 수 @requests와 함께@complete_path_to_json_file

참고 : @파일 경로 앞에 중요합니다.


경로에 대한 예를 들어 줄 수 있습니까? 그것을 찾을 자신이 할 수없는, 심지어 다음 거기에 배치 : 난 포기 "\ accounts.json @c"입니다
Piyush 미탈

4
그것은해야 @ "C : \ accounts.json"
람 프라 탑

다음과 같은 헤더 플래그를 추가하십시오. -H "Content-Type : application / json"
Shady Kip

8

아무도 언급하지 않은 한 가지 : JSON 파일에는 "순수한"JSON 파일의 모든 줄에 대해 다음 줄이 속하는 색인을 지정하는 한 줄이 있어야합니다.

IE

{"index":{"_index":"shakespeare","_type":"act","_id":0}}
{"line_id":1,"play_name":"Henry IV","speech_number":"","line_number":"","speaker":"","text_entry":"ACT I"}

그것 없이는 아무것도 작동하지 않으며 이유를 알 수 없습니다.


8

json 파일과 동일한 디렉토리에 있는지 확인한 다음 간단히 실행했습니다.

curl -s -H "Content-Type: application/json" -XPOST localhost:9200/product/default/_bulk?pretty --data-binary @product.json

따라서 당신도 같은 디렉토리에 있는지 확인하고 이런 식으로 실행하십시오. 참고 : 명령의 product / default /는 내 환경에 특정한 것입니다. 이를 생략하거나 자신과 관련된 것으로 바꿀 수 있습니다.


6

https://www.getpostman.com/docs/environments 에서 우체부를 얻으 십시오. / test / test / 1 / _bulk? pretty 명령을 사용하여 파일 위치를 지정하십시오. 여기에 이미지 설명 입력


2
{ "error": "uri [/ test / test / 1 / _bulk? pretty] 및 메소드 [POST]에 대한 핸들러를 찾을 수 없음"}
Chiel

{ "error": "Content-Type header [text / plain] is not supported", "status": 406}
X. L

5

당신은 사용하고 있습니다

$ curl -s -XPOST localhost:9200/_bulk --data-binary @requests

'requests'가 json 파일 인 경우이를 다음으로 변경해야합니다.

$ curl -s -XPOST localhost:9200/_bulk --data-binary @requests.json

이 전에 json 파일이 색인화되지 않은 경우 json 파일 내부의 각 행 앞에 색인 행을 삽입해야합니다. JQ로이를 수행 할 수 있습니다. 아래 링크를 참조하십시오 : http://kevinmarsh.com/2014/10/23/using-jq-to-import-json-into-elasticsearch.html

elasticsearch 튜토리얼 (예 : 셰익스피어 튜토리얼)로 이동하여 사용 된 json 파일 샘플을 다운로드하고 살펴보십시오. 각 json 객체 (각 개별 라인) 앞에 인덱스 라인이 있습니다. 이것은 jq 명령을 사용한 후 찾고있는 것입니다. 이 형식은 대량 API를 사용하는 데 필수이며 일반 json 파일은 작동하지 않습니다.


1

Elasticsearch 7.7부터는 콘텐츠 유형도 지정해야합니다.

curl -s -H "Content-Type: application/json" -XPOST localhost:9200/_bulk --data-binary @<absolute path to JSON file>

0

VirtualBox 및 UBUNTU를 사용하거나 단순히 UBUNTU를 사용하는 경우 유용 할 수 있습니다.

wget https://github.com/andrewvc/ee-datasets/archive/master.zip
sudo apt-get install unzip (only if unzip module is not installed)
unzip master.zip
cd ee-datasets
java -jar elastic-loader.jar http://localhost:9200 datasets/movie_db.eloader

0

Filesystem API를 통해 Elasticsearch API를 노출하는 코드를 작성했습니다.

예를 들어 데이터의 명확한 내보내기 / 가져 오기를하는 것이 좋습니다.

프로토 타입 elasticdriver를 만들었습니다 . FUSE 기반

데모


0
  • Elastic Search 7.7 이상 버전을 사용하는 경우 아래 명령을 따르십시오.

    curl -H "Content-Type: application/json" -XPOST "localhost:9200/bank/_bulk? pretty&refresh" --data-binary @"/Users/waseem.khan/waseem/elastic/account.json"

  • 위의 파일 경로는 /Users/waseem.khan/waseem/elastic/account.json.

  • Elastic Search 6.x 버전을 사용하는 경우 아래 명령을 사용할 수 있습니다.

curl -X POST localhost:9200/bank/_bulk?pretty&refresh --data-binary @"/Users/waseem.khan/waseem/elastic/account.json" -H 'Content-Type: application/json'

참고 : 마지막에 .json 파일에서 하나의 빈 줄을 추가하십시오. 그렇지 않으면 예외가 발생합니다.

"error" : {
"root_cause" : [
  {
    "type" : "illegal_argument_exception",
    "reason" : "The bulk request must be terminated by a newline [\n]"
  }
],
"type" : "illegal_argument_exception",
"reason" : "The bulk request must be terminated by a newline [\n]"
},
`enter code here`"status" : 400
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.