5

公式ドキュメントUpdate API - Upsertsscripted_upsertによると、スクリプト内で更新 (既存のドキュメントの場合) または挿入 (新しいドキュメントの場合) フォームを処理するために使用できます。問題は、それを行うためにスクリプトがどのように見えるべきかを決して示していないということです。Java - Update APIには、ScriptUpsert の使用に関する情報がありません。

これは私が使用しているコードです:

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

Java コードから scriptUpsert を機能させるにはどうすればよいですか?

4

2 に答える 2

4

コマンド (およびそのスクリプト)は次のscripted_upsertようになります。

POST /sessions/session/1/_update
{
  "scripted_upsert": true,
  "script": {
    "inline": "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": {}一部が欠けています。

于 2016-08-02T11:57:38.850 に答える
0

Andrei が提案したように、関数を次のように変更して、アップサート部分が欠落していました。

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);
}

修理する。

于 2016-08-02T12:04:46.753 に答える