2017-09-08 20 views
0

PowerShell経由でElasticSearchにデータをプッシュしようとしています。私はデータをJSONに変換してから、Invoke-WebRequestInvoke-RestMethodの両方を試していますが、不正なデータやコンテンツタイプのエラーはサポートされていません。私はそれが私のためにそれを作成すると信じて私はインデックスを作成していない。私が間違っている/欠けているものに支援することができPowerShell JSONをElasticSearchに投稿

誰ですか?

例コード:

$data = @() 
$CustomObject = [pscustomobject]@{ 
     SqlInstance = "myserver1" 
     Database = "mydb" 
     Schema = "versioning" 
     Name = "DataVersionHistory" 
     IndexSpaceUsed = 0 
     DataSpaceUsed = 0 
     RowCount = 0 
     }; 
$data += $CustomObject; 
$CustomObject = [pscustomobject]@{ 
     SqlInstance = "myserver1" 
     Database = "mydb" 
     Schema = "versioning" 
     Name = "VersionHistory" 
     IndexSpaceUsed = 10 
     DataSpaceUsed = 25 
     RowCount = 3000 
     }; 
$data += $CustomObject; 
$myJson = ConvertTo-Json -InputObject $data ; 
Invoke-RestMethod -Uri http://localhost:9200/myindex/mytype/_bulk?pretty ` 
-Method POST -Body $myJson -ContentType "application/json" 
+0

JSONはPowerShellで有効なもちろんではありません...キーWITH'フルJSONを投稿:[値] – Kiran

+0

こんにちはキラン、より正確にし、JSONオブジェクト – Staggerlee011

+0

をクリアするには、更新スクリプトの例ではよさそうです..もしポストが動作していなければ 'put'メソッドを試してください。 – Kiran

答えて

0

バルク要求は実際のJSONではありません。あなたは、配列$dataに含まれるオブジェクトのコレクションを持っている。この時点で

curl -XPOST 'localhost:9200/_bulk?pretty' -H 'Content-Type: application/json' -d' 
{ "index" : { "_index" : "test", "_type" : "type1", "_id" : "1" } } 
{ "field1" : "value1" } 
{ "delete" : { "_index" : "test", "_type" : "type1", "_id" : "2" } } 
{ "create" : { "_index" : "test", "_type" : "type1", "_id" : "3" } } 
{ "field1" : "value3" } 
{ "update" : {"_id" : "1", "_type" : "type1", "_index" : "test"} } 
{ "doc" : {"field2" : "value2"} } 
' 
+0

こんにちはVitaliy、どのようにjson形式のデータ(または別の形式のデータ)をプッシュしますか?それを構文に変換する必要がありますか? – Staggerlee011

+0

これはElasticSearchの構文であり、あなたの要求をこの形式に変換する必要があるのは私の構文ではありません。バルクAPIを使用する場合 –

+0

Vitalyさん、ありがとうございます。依然として問題があります。何か案は? – Staggerlee011

0
$data = @() 
    $CustomObject = [pscustomobject]@{ 
     SqlInstance = "myserver1" 
     Database  = "mydb" 
     Schema   = "versioning" 
     Name   = "DataVersionHistory" 
     IndexSpaceUsed = 0 
     DataSpaceUsed = 0 
     RowCount  = 0 
    }; 
    $data += $CustomObject; 
    $CustomObject = [pscustomobject]@{ 
     SqlInstance = "myserver1" 
     Database  = "mydb" 
     Schema   = "versioning" 
     Name   = "VersionHistory" 
     IndexSpaceUsed = 10 
     DataSpaceUsed = 25 
     RowCount  = 3000 
    }; 
    $data += $CustomObject 

:あなたは、次の表記を使用する必要があります。

注:バルクAPI用のJSONデータの最後の行が改行文字\ nので終わらなければなりません。だから私はhere-stringを使って各json要素に改行文字\nを追加しています。

また、私はかわいいプリントを削除しました。これはバルクAPIでうまくいくことです。

doc_as_upsertは、docが新規として追加しない場合は、それだけを残して存在している場合ことを保証します。

$json_col = @() 
$data | 
    ForEach-Object { 
     #convert object to json 
     $json_element = @{doc = $_; doc_as_upsert = $true}  
      | ConvertTo-Json -Depth 1 -Compress 

     #construt here string with literal \n 
     $json_col += @" 

$json_element\n 

"@ 
    } 
Invoke-RestMethod -Method Post -Uri "http://localhost:9200/myindex/mytype/_bulk?" -Body $json_col -ErrorAction Stop 
+0

こんにちはキラン、情報のおかげで(私はそれが本当に適切なそれを構築するチャンスを持っていなかったことを結論に来ていた結論に来ていた)悲しいことに私はまだこれを実行するときにエラーが表示されます: {1} "、" type ":" illegal_argument_exception "{{error}:{" root_cause ":{{" type ":" illegal_argument_exception "、" reason " 、 "reason": "アクション/メタデータライン[2]に未知のパラメータが含まれています [id]"}、 "status":400} – Staggerlee011

+0

上記が有効です。私はあなたが型を持つインデックスを作成し、その型を 'invoke-restmethod'で指定する必要があると思います...とにかくgoodluck – Kiran

+0

誰かが一緒に遊んでいます。 PUTのDBA2 { "マッピング":{ "テーブル":{ "_all":{ "有効":真}、 "プロパティ":{ "SQLINSTANCE" 私を介してマッピングして索引を作成しました。 "名前":{"タイプ": "テキスト"}、 "データベース":{"タイプ": "テキスト"}、 "スキーマ""RowCount":{"type": "integer"} "データスペース":"IndexSpaceUsed":{"型": "整数"} "DataSpaceUsed":{"型": "整数"} } } } } – Staggerlee011

関連する問題