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のインデックス付けを手伝うことができますか?
必要なのは、その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_index
とyour_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"}
現在、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の回答に示されているものと同じままです。
有効な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#汎用リストです。