web-dev-qa-db-ja.com

Elasticsearch Bulk Index JSONデータ

JSONファイルを新しいElasticsearchインデックスに一括インデックス化しようとしていますが、できません。 JSON内に次のサンプルデータがあります

[{"Amount": "480", "Quantity": "2", "Id": "975463711", "Client_Store_sk": "1109"},
{"Amount": "2105", "Quantity": "2", "Id": "975463943", "Client_Store_sk": "1109"},
{"Amount": "2107", "Quantity": "3", "Id": "974920111", "Client_Store_sk": "1109"},
{"Amount": "2115", "Quantity": "2", "Id": "975463798", "Client_Store_sk": "1109"},
{"Amount": "2116", "Quantity": "1", "Id": "975463827", "Client_Store_sk": "1109"},
{"Amount": "648", "Quantity": "3", "Id": "975464139", "Client_Store_sk": "1109"},
{"Amount": "2126", "Quantity": "2", "Id": "975464805", "Client_Store_sk": "1109"},
{"Amount": "2133", "Quantity": "1", "Id": "975464061", "Client_Store_sk": "1109"},
{"Amount": "1339", "Quantity": "4", "Id": "974919458", "Client_Store_sk": "1109"},
{"Amount": "1196", "Quantity": "5", "Id": "974920538", "Client_Store_sk": "1109"},
{"Amount": "1198", "Quantity": "4", "Id": "975463638", "Client_Store_sk": "1109"},
{"Amount": "1345", "Quantity": "4", "Id": "974919522", "Client_Store_sk": "1109"},
{"Amount": "1347", "Quantity": "2", "Id": "974919563", "Client_Store_sk": "1109"},
{"Amount": "673", "Quantity": "2", "Id": "975464359", "Client_Store_sk": "1109"},
{"Amount": "2153", "Quantity": "1", "Id": "975464511", "Client_Store_sk": "1109"},
{"Amount": "3896", "Quantity": "4", "Id": "977289342", "Client_Store_sk": "1109"},
{"Amount": "3897", "Quantity": "4", "Id": "974920602", "Client_Store_sk": "1109"}]

使っています

 curl -XPOST localhost:9200/index_local/my_doc_type/_bulk --data-binary --data @/home/data1.json 

Elasticsearchの標準バルクインデックスAPIを使用しようとすると、このエラーが発生します

 error: {"message":"ActionRequestValidationException[Validation Failed: 1: no requests added;]"}

誰でもこのタイプのJSONのインデックス付けを手伝うことができますか?

20
Amit P

必要なのは、そのJSONファイルを読み取り、 _bulkエンドポイント で期待される形式(つまり、コマンド用の1行とドキュメント用の1行)で一括リクエストを作成することです。改行文字で区切られています...各ドキュメントに対してすすぎ、繰り返します:

curl -XPOST localhost:9200/your_index/_bulk -d '
{"index": {"_index": "your_index", "_type": "your_type", "_id": "975463711"}}
{"Amount": "480", "Quantity": "2", "Id": "975463711", "Client_Store_sk": "1109"}
{"index": {"_index": "your_index", "_type": "your_type", "_id": "975463943"}}
{"Amount": "2105", "Quantity": "2", "Id": "975463943", "Client_Store_sk": "1109"}
... etc for all your documents
'

your_indexyour_typeを、使用している実際のインデックスとタイプ名に置き換えてください。

[〜#〜] update [〜#〜]

URLで_indexおよび_typeが指定されている場合、それらを削除することにより、コマンドラインを短縮できることに注意してください。マッピングで idフィールドへのパス を指定すると、_idを削除することもできます(ただし、この機能はES 2.0では非推奨になります)。少なくとも、コマンドラインはすべてのドキュメントに対して{"index":{}}のように見えますが、実行する操作の種類(この場合はindexドキュメント)を指定するために常に必須です。

UPDATE 2

curl -XPOST localhost:9200/index_local/my_doc_type/_bulk --data-binary  @/home/data1.json

/home/data1.jsonは次のようになります。

{"index":{}}
{"Amount": "480", "Quantity": "2", "Id": "975463711", "Client_Store_sk": "1109"}
{"index":{}}
{"Amount": "2105", "Quantity": "2", "Id": "975463943", "Client_Store_sk": "1109"}
{"index":{}}
{"Amount": "2107", "Quantity": "3", "Id": "974920111", "Client_Store_sk": "1109"}
38
Val

現在、6.1.2はElasticSearchの最新バージョンであり、Windows(x64)で動作するcurlコマンドは

curl -s -XPOST localhost:9200/my_index/my_index_type/_bulk -H "Content-Type: 
application/x-ndjson" --data-binary @D:\data\mydata.json

Mydata.jsonに存在するはずのデータの形式は、@ valの回答に示されているものと同じままです。

7
Thomas

有効なElasticsearchバルクAPIリクエストは次のようなものになります(改行で終わる):

POST http:// localhost:9200/products_slo_development_temp_2/productModel/_bulk

{ "index":{ } } 
{"RequestedCountry":"slo","Id":1860,"Title":"Stol"} 
{ "index":{ } } 
{"RequestedCountry":"slo","Id":1860,"Title":"Miza"} 

ElasticsearchバルクAPIドキュメント: https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-bulk.html

これが私のやり方です

POST httpリクエストを送信します。HTTPリクエストのURI/URLとしてuri変数を使用し、elasticsearchJson変数は、 ElasticsearchバルクAPI用にフォーマットされたhttpリクエスト:

var uri = @"/" + indexName + "/productModel/_bulk";
var json = JsonConvert.SerializeObject(sqlResult);
var elasticsearchJson = GetElasticsearchBulkJsonFromJson(json, "RequestedCountry");

ElasticsearchバルクAPIに必要なJSON形式を生成するためのヘルパーメソッド:

public string GetElasticsearchBulkJsonFromJson(string jsonStringWithArrayOfObjects, string firstParameterNameOfObjectInJsonStringArrayOfObjects)
{
  return @"{ ""index"":{ } } 
" + jsonStringWithArrayOfObjects.Substring(1, jsonStringWithArrayOfObjects.Length - 2).Replace(@",{""" + firstParameterNameOfObjectInJsonStringArrayOfObjects + @"""", @" 
{ ""index"":{ } } 
{""" + firstParameterNameOfObjectInJsonStringArrayOfObjects + @"""") + @"
";
}

JSONオブジェクトの最初のプロパティ/フィールドはRequestedCountryプロパティであるため、この例で使用します。

productModelは私のElasticsearchドキュメントタイプです。 sqlResultは、製品を含むC#汎用リストです。

0
Tadej