wake-up-neo.com

Überprüfung fehlgeschlagen: 1: Bei der Massenindizierung von ElasticSearch wurden keine Anforderungen hinzugefügt

Ich habe eine JSON-Datei und muss sie auf dem ElasticSearch-Server indizieren. 

Die JSOIN-Datei sieht folgendermaßen aus:

{
    "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"
      }
    }
  }

Aber wenn ich versuche, diese JSON-Datei mit dem Befehl zu indizieren 

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

Ich erhalte diesen Fehler:

{"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}

Ich weiß nicht, wo ich einen Fehler mache.

16
rick

Die Massen-API von Elasticsearch verwendet eine spezielle Syntax, die tatsächlich aus json-Dokumenten besteht, die in einzelnen Zeilen geschrieben sind. Schauen Sie sich die Dokumentation an .

Die Syntax ist ziemlich einfach. Für die Indizierung, Erstellung und Aktualisierung benötigen Sie zwei einzeilige Json-Dokumente. In der ersten Zeile wird die Aktion angegeben, in der zweiten Zeile wird das Dokument indiziert/erstellt/aktualisiert. Um ein Dokument zu löschen, wird nur die Aktionszeile benötigt. Zum Beispiel (aus der Dokumentation):

{ "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" } }

Vergessen Sie nicht, Ihre Datei mit einer neuen Zeile zu beenden. Verwenden Sie dann den Befehl, um die Bulk-API aufzurufen: 

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

Aus der Dokumentation:

Wenn Sie eine Textdatei für curl eingeben, müssen Sie das Flag --data-binary anstelle von plain -d verwenden.

27
davide

Ich hatte ein ähnliches Problem, als ich ein bestimmtes Dokument eines bestimmten Typs löschen wollte. Durch die obige Antwort konnte ich endlich mein einfaches Bash-Skript zum Laufen bringen!

Ich habe eine Datei mit einer document_id pro Zeile (document_id.txt) und mit dem untenstehenden Bash-Skript kann ich Dokumente eines bestimmten Typs mit den genannten document_id löschen.

So sieht die Datei aus:

c476ce18803d7ed3708f6340fdfa34525b20ee90
5131a30a6316f221fe420d2d3c0017a76643bccd
08ebca52025ad1c81581a018febbe57b1e3ca3cd
496ff829c736aa311e2e749cec0df49b5a37f796
87c4101cb10d3404028f83af1ce470a58744b75c
37f0daf7be27cf081e491dd445558719e4dedba1

Das Bash-Skript sieht folgendermaßen aus:

#!/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

Der Trick bestand nach viel Frust darin, die Option -e zum Echo zu verwenden und\n\n an die Ausgabe des Echos anzuhängen, bevor ich es in curl leitete. 

Und dann habe ich in curl dann die Option --data-binary , um zu stoppen, dass die für den Endpunkt _bulk benötigten\n\n entfernt werden, gefolgt von der @ - Option um es von stdin zu lesen!

0