web-dev-qa-db-ja.com

検証に失敗しました:1:ElasticSearchのバルクインデックスにリクエストが追加されていません

JSONファイルがあり、ElasticSearchサーバーでインデックスを作成する必要があります。

JSOINファイルは次のようになります。

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

しかし、コマンドを使用してこのJSONファイルのインデックスを作成しようとすると

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

私はこのエラーを受け取ります:

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

どこで間違いを犯しているのかわかりません。

16
rick

ElasticsearchのバルクAPIは特別な構文を使用します。これは実際には単一行で記述されたjsonドキュメントで構成されています。 ドキュメント をご覧ください。

構文は非常に単純です。インデックス作成、作成、更新には、2行のjsonドキュメントが必要です。最初の行はアクションを示し、2行目はドキュメントにインデックス/作成/更新を与えます。ドキュメントを削除するには、アクション行のみが必要です。例(ドキュメントから):

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

新しい行でファイルを終了することを忘れないでください。次に、バルクAPIを呼び出すには、次のコマンドを使用します。

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

ドキュメントから:

Curlにテキストファイルの入力を提供する場合は、--data-binaryフラグの代わりにプレーン-d

29
davide

特定の種類の特定のドキュメントを削除したいという点で同様の問題があり、上記の回答を介して、簡単なbashスクリプトを最終的に機能させることができました!

1行にdocument_idを持つファイル(document_id.txt)があり、以下のbashスクリプトを使用して、前述のdocument_idを持つ特定のタイプのドキュメントを削除できます。

ファイルは次のようになります。

c476ce18803d7ed3708f6340fdfa34525b20ee90
5131a30a6316f221fe420d2d3c0017a76643bccd
08ebca52025ad1c81581a018febbe57b1e3ca3cd
496ff829c736aa311e2e749cec0df49b5a37f796
87c4101cb10d3404028f83af1ce470a58744b75c
37f0daf7be27cf081e491dd445558719e4dedba1

Bashスクリプトは次のようになります。

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

たくさんのフラストレーションの後、トリックは-eオプションを使用してエコーし、\ n\nをechoの出力に追加してから、それをcurlにパイプしました。

そして次にcurlで-data-binaryオプションを設定して、_ bulkに必要な\ n\nを削除するのを止めますエンドポイントの後に@-オプションを付けて、stdinから読み取ります!

0