2016-08-02 16 views
1

公式文書Update API - Upsertsによれば、スクリプト内での更新(既存文書の場合)または挿入(新しい文書の場合)を処理するためにscripted_upsertを使用できます。事は、スクリプトがそれを行うためにどのように見えるべきかを決して示していないことです。 Java - Update API ScriptUpsertの使用に関する情報はありません。ElasticSearchのscript_upsertを使用して文書を作成する

//My function to build and use the upsert 
public void scriptedUpsert(String key, String parent, String scriptSource, Map<String, ? extends Object> parameters) { 
    Script script = new Script(scriptSource, ScriptType.INLINE, null, parameters); 
    UpdateRequest request = new UpdateRequest(index, type, key); 
    request.scriptedUpsert(true); 
    request.script(script); 
    if (parent != null) { 
     request.parent(parent); 
    } 
    this.bulkProcessor.add(request); 
} 

//A test call to validate the function 
String scriptSource = "if (!ctx._source.hasProperty(\"numbers\")) {ctx._source.numbers=[]}"; 
Map<String, List<Integer>> parameters = new HashMap<>(); 
List<Integer> numbers = new LinkedList<>(); 
numbers.add(100); 
parameters.put("numbers", numbers); 

bulk.scriptedUpsert("testUser", null, scriptSource, parameters); 

そして「TESTUSER」の文書が存在しないとき、私は次の例外を取得しています:
DocumentMissingException[[user][testUser]: document missing

はどのようにして作ることができます

この

は、私が使用しているコードです。 scriptUpsertはJavaコードから動作しますか?

答えて

1

これはscripted_upsertコマンドは次のようになり(およびそのスクリプト)する方法です。

POST /sessions/session/1/_update 
{ 
    "scripted_upsert": true, 
    "script": { 
    "script": "if (ctx.op == \"create\") ctx._source.numbers = newNumbers; else ctx._source.numbers += updatedNumbers", 
    "params": { 
     "newNumbers": [1,2,3], 
     "updatedNumbers": [55] 
    } 
    }, 
    "upsert": {} 
} 

あなたは上記のコマンドを呼び出すと、インデックスが存在しない場合、それは一緒にnewNumbers値で、それを作成します。新しい文書では同じコマンドを再度呼び出すとnumbersの値は1,2,3,55になります。

あなたのケースでは、"upsert": {}部分がありません。

0

アンドレイは、私は機能を変更、アップサートの一部が欠落していた示唆したように:

public void scriptedUpsert(String key, String parent, String scriptSource, Map<String, ? extends Object> parameters) { 
    Script script = new Script(scriptSource, ScriptType.INLINE, null, parameters); 
    UpdateRequest request = new UpdateRequest(index, type, key); 
    request.scriptedUpsert(true); 
    request.script(script); 
    request.upsert("{}"); // <--- The change 
    if (parent != null) { 
     request.parent(parent); 
    } 
    this.bulkProcessor.add(request); 
} 

それを修正。

関連する問題