2016-04-21 14 views
14

Mam plik JSON i muszę go zaindeksować na serwerze ElasticSearch.Sprawdzanie poprawności nie powiodło się: 1: żadne żądania nie zostały dodane w zbiorczym indeksowaniu ElasticSearch

plik JSOIN wygląda następująco:

{ 
    "sku": "1", 
    "vbid": "1", 
    "created": "Sun, 05 Oct 2014 03:35:58 +0000", 
    "updated": "Sun, 06 Mar 2016 12:44:48 +0000", 
    "type": "Single", 
    "downloadable-duration": "perpetual", 
    "online-duration": "365 days", 
    "book-format": "ePub", 
    "build-status": "In Inventory", 
    "description": "On 7 August 1914, a week before the Battle of Tannenburg and two weeks before the Battle of the Marne, the French army attacked the Germans at Mulhouse in Alsace. Their objective was to recapture territory which had been lost after the Franco-Prussian War of 1870-71, which made it a matter of pride for the French. However, after initial success in capturing Mulhouse, the Germans were able to reinforce more quickly, and drove them back within three days. After forty-three years of peace, this was the first test of strength between France and Germany. In 1929 Karl Deuringer wrote the official history of the battle for the Bavarian Army, an immensely detailed work of 890 pages; First World War expert and former army officer Terence Zuber has translated this study and edited it down to more accessible length, to produce the first account in English of the first major battle of the First World War.", 
    "publication-date": "07/2014", 
    "author": "Deuringer, Karl", 
    "title": "The First Battle of the First World War: Alsace-Lorraine", 
    "sort-title": "First Battle of the First World War: Alsace-Lorraine", 
    "edition": "0", 
    "sampleable": "false", 
    "page-count": "0", 
    "print-drm-text": "This title will only allow printing of 2 consecutive pages at a time.", 
    "copy-drm-text": "This title will only allow copying of 2 consecutive pages at a time.", 
    "kind": "book", 
    "fro": "false", 
    "distributable": "true", 
    "subjects": { 
     "subject": [ 
     { 
      "-schema": "bisac", 
      "-code": "HIS027090", 
      "#text": "World War I" 
     }, 
     { 
      "-schema": "coursesmart", 
      "-code": "cs.soc_sci.hist.milit_hist", 
      "#text": "Social Sciences -> History -> Military History" 
     } 
     ] 
    }, 
    "pricelist": { 
     "publisher-list-price": "0.0", 
     "digital-list-price": "7.28" 
    }, 
    "publisher": { 
     "publisher-name": "The History Press", 
     "imprint-name": "The History Press Ireland" 
    }, 
    "aliases": { 
     "eisbn-canonical": "1", 
     "isbn-canonical": "1", 
     "print-isbn-canonical": "9780752460864", 
     "isbn13": "1", 
     "isbn10": "0750951796", 
     "additional-isbns": { 
     "isbn": [ 
      { 
      "-type": "print-isbn-10", 
      "#text": "0752460862" 
      }, 
      { 
      "-type": "print-isbn-13", 
      "#text": "97807524608" 
      } 
     ] 
     } 
    }, 
    "owner": { 
     "company": { 
     "id": "1893", 
     "name": "The History Press" 
     } 
    }, 
    "distributor": { 
     "company": { 
     "id": "3658", 
     "name": "asc" 
     } 
    } 
    } 

Ale gdy próbuję indeksowania ten plik JSON, używając polecenia

curl -XPOST 'http://localhost:9200/_bulk' -d @1.json 

otrzymuję ten błąd:

{"error":{"root_cause":[{"type":"action_request_validation_exception","reason":"Validation Failed: 1: no requests added;"}],"type":"action_request_validation_exception","reason":"Validation Failed: 1: no requests added;"},"status":400} 

I don” wiem, gdzie popełniam błąd.

Odpowiedz

23

Ogromne API funkcji Elasticsearch używa specjalnej składni, która w rzeczywistości składa się z dokumentów zapisanych w jednym wierszu. Spójrz na documentation.

Składnia jest dość prosta. Do indeksowania, tworzenia i aktualizowania potrzebne są 2 jednoliniowe dokumenty JSON. Pierwsze wiersze informują o akcji, a druga - o indeksie/tworzeniu/aktualizacji. Aby usunąć dokument, potrzebny jest tylko wiersz akcji. Na przykład (z dokumentacją):

{ "index" : { "_index" : "test", "_type" : "type1", "_id" : "1" } } 
{ "field1" : "value1" } 
{ "create" : { "_index" : "test", "_type" : "type1", "_id" : "3" } } 
{ "field1" : "value3" } 
{ "update" : {"_id" : "1", "_type" : "type1", "_index" : "index1"} } 
{ "doc" : {"field2" : "value2"} } 
{ "delete" : { "_index" : "test", "_type" : "type1", "_id" : "2" } } 

Nie zapomnij, aby zakończyć swój plik z nową linią. Następnie zadzwonić większość api użyć polecenia:

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

Z dokumentacji:

If you’re providing text file input to curl, you must use the --data-binary flag instead of plain -d

+1

"Nie zapomnij zakończyć pliku nowym wierszem." Dziękujemy! Uratował mnie tutaj godzinę. –

+6

** Nie zapomnij zakończyć pliku nową linią ** .. 3 rano przeklinając laptopa, właśnie uratowałeś mi życie lol .. –

+0

Również głupie ... że nie byłoby to zrobić ... docs mówi '--data-binarne "@requests"' Opcja '@' musi być przed nazwą pliku jeśli, zapominasz, że to również się nie udaje. –

0

Miałem podobny problem, że chcę usunąć konkretny dokument określonego typu i poprzez powyższą odpowiedź udało mi się wreszcie uruchomić mój prosty skrypt bash!

Mam plik, który ma id_dokumentu w wierszu (id_dokumentu.txt) i za pomocą poniższego skryptu bash można usunąć dokumenty określonego typu z wymienionych id_dokumentów.

To co wygląda jak plik:

c476ce18803d7ed3708f6340fdfa34525b20ee90 
5131a30a6316f221fe420d2d3c0017a76643bccd 
08ebca52025ad1c81581a018febbe57b1e3ca3cd 
496ff829c736aa311e2e749cec0df49b5a37f796 
87c4101cb10d3404028f83af1ce470a58744b75c 
37f0daf7be27cf081e491dd445558719e4dedba1 

Skrypt bash wygląda następująco:

#!/bin/bash 

es_cluster="http://localhost:9200" 
index="some-index" 
doc_type="some-document-type" 

for doc_id in `cat document_id.txt` 
do 
    request_string="{\"delete\" : { \"_type\" : \"${doc_type}\", \"_id\" : \"${doc_id}\" } }" 
    echo -e "${request_string}\r\n\r\n" | curl -s -XPOST "${es_cluster}/${index}/${doc_type}/_bulk" --data-binary @- 
    echo 
done 

Sztuką po wielu frustracji, było użyć opcji -e do echo i dołączyć \ n \ n do wyjścia echa, zanim wypuściłem go do curl.

A potem w zwinięcie Mam następnie --data-binarny Opcja ustawić, aby zatrzymać go stripping się z \ n \ n potrzebne do końcowego _bulk następnie przez @ - opcja uzyskania to czytać ze standardowego wejścia!