ElasticSearch6.XバージョンJava Api中国語詳細解(七)のUpdate By Query API解析

5942 ワード

注意:ESのマルチスレッド更新は、abortOnVersionConflict(false)によって設定されるレポートバージョンの競合が強制的に実行されるかどうかを示します.
参照API:
https://static.javadoc.io/org.elasticsearch/elasticsearch/6.0.1/org/elasticsearch/index/reindex/DeleteByQueryRequestBuilder.html
updateByQueryの最も簡単な使い方は、ソースを変更することなく、インデックス内の各ドキュメントを更新することです.この方法では、新しいプロパティまたは別のオンラインマッピングの変更を選択できます.
UpdateByQueryRequestBuilder updateByQuery = UpdateByQueryAction.INSTANCE.newRequestBuilder(client);

updateByQuery.source("source_index").abortOnVersionConflict(false);

BulkByScrollResponse response = updateByQuery.get();

updateByQuery APIの呼び出しは、まずインデックスのスナップショットを取得し、内部バージョン制御を使用するドキュメントをインデックスします.
注:スナップショットの時間とインデックス要求プロセスの時間の間にドキュメントが変化すると、バージョン競合が発生します.
 
バージョンが一致すると、updateByQueryはドキュメントを更新し、バージョン番号を追加します.
 
すべての更新とクエリーが失敗すると、updateByQueryが中止されます.これらの障害はbulkby scroll response getindeメソッドから得ることができる.成功した更新はすべて保持され、ロールバックされません.最初の障害によって中止が発生した場合、応答には失敗したバッチ要求によって発生したすべての障害が含まれます.
 
バージョン競合によるupdateByQueryの中止を防止するために、終了競合(false)を設定します.最初の例は、オンラインマッピングの変更を取得しようとするためです.バージョンの競合は、updateByQueryの開始とドキュメントの更新を試みる時間の間に競合するドキュメントが更新されることを意味します.更新はオンラインマップの更新を受けるので、これはいいです.
 
UpdateByQueryRequestBuilder APIでは、更新されたドキュメントのフィルタリングをサポートし、更新されたドキュメントの合計数を制限し、スクリプトを使用してドキュメントを更新します.
UpdateByQueryRequestBuilder updateByQuery = UpdateByQueryAction.INSTANCE.newRequestBuilder(client);

updateByQuery.source("source_index")

.filter(QueryBuilders.termQuery("level", "awesome"))

.size(1000)

.script(new Script(ScriptType.INLINE, "ctx._source.awesome = 'absolutely'", "painless", Collections.emptyMap()));

BulkByScrollResponse response = updateByQuery.get();

UpdateByQueryRequestBuilderでは、ドキュメントを選択するためのクエリーにも直接アクセスできます.このアクセスを使用すると、デフォルトのスクロールサイズを変更したり、ドキュメントに一致するリクエストを変更したりできます.

UpdateByQueryRequestBuilder updateByQuery = UpdateByQueryAction.INSTANCE.newRequestBuilder(client);

updateByQuery.source("source_index")

.source().setSize(500);

BulkByScrollResponse response = updateByQuery.get();

また、更新されたドキュメントを制限するために、サイズをソートすることもできます.
UpdateByQueryRequestBuilder updateByQuery = UpdateByQueryAction.INSTANCE.newRequestBuilder(client);

updateByQuery.source("source_index").size(100)

.source().addSort("cat", SortOrder.DESC);

BulkByScrollResponse response = updateByQuery.get();

ドキュメントのソースコードフィールドの変更に加えて、APIの更新と同様に、1つの足を使用してアクションを変更することもできます.
UpdateByQueryRequestBuilder updateByQuery = UpdateByQueryAction.INSTANCE.newRequestBuilder(client);

updateByQuery.source("source_index")

.script(new Script(

ScriptType.INLINE,

"if (ctx._source.awesome == 'absolutely) {"

+ " ctx.op='noop'"

+ "} else if (ctx._source.awesome == 'lame') {"

+ " ctx.op='delete'"

+ "} else {"

+ "ctx._source.awesome = 'absolutely'}",

"painless",

Collections.emptyMap()));

BulkByScrollResponse response = updateByQuery.get();

APIの更新と同様にctxの値を設定できます.op実行する操作を変更する:
操作なし
ctx設定.スクリプトに何の変化もない場合は、op=「noop」です.updateByQuery operatonでは、ドキュメントが更新から削除されます.この挙動は応答体中のnoopカウンタを増加させた.
削除
ctx設定.スクリプトがドキュメントを削除する必要があると決定した場合、op=「delete」です.削除応答本体から削除されるカウンタでレポートされます.
ctxを設定します.opは他の値に対してエラーを発生します.ctxで他のフィールドを設定するとエラーが発生します.
このAPIでは、触れたドキュメントを移動することはできません.ソースコードを変更するだけです.これはわざとだ!ファイルを元の場所から削除する規定はありません.
また、APIの検索と同様に、複数のインデックスとタイプで一度に実行することもできます.
UpdateByQueryRequestBuilder updateByQuery = UpdateByQueryAction.INSTANCE.newRequestBuilder(client);

updateByQuery.source("foo", "bar").source().setTypes("a", "b");

BulkByScrollResponse response = updateByQuery.get();

ルーティング値を指定すると、プロセスはルーティング値をスクロールクエリにコピーし、そのルーティング値に一致するフラグメントに制限します.
UpdateByQueryRequestBuilder updateByQuery = UpdateByQueryAction.INSTANCE.newRequestBuilder(client);

updateByQuery.source().setRouting("cat");

BulkByScrollResponse response = updateByQuery.get();

updateByQueryでは、このようなパイプを指定することで、摂取ノードを使用することもできます.
UpdateByQueryRequestBuilder updateByQuery = UpdateByQueryAction.INSTANCE.newRequestBuilder(client);

updateByQuery.setPipeline("hurray");

BulkByScrollResponse response = updateByQuery.get();

Works with the Task APIedit
Task APIを使用して、更新クエリー要求を実行するすべてのステータスを取得できます.
ListTasksResponse tasksList = client.admin().cluster().prepareListTasks()

.setActions(UpdateByQueryAction.NAME).setDetailed(true).get();

for (TaskInfo info: tasksList.getTasks()) {

TaskId taskId = info.getTaskId();

BulkByScrollTask.Status status = (BulkByScrollTask.Status) info.getStatus();

// do stuff

}

TaskIdは、タスクを直接検索できます.
GetTaskResponse get = client.admin().cluster().prepareGetTask(taskId).get();

Works with the Cancel Task APIedit
クエリーの更新はTask Cancel APIを使用してキャンセルできます.

// Cancel all update-by-query requests

client.admin().cluster().prepareCancelTasks().setActions(UpdateByQueryAction.NAME).get().getTasks();

// Cancel a specific update-by-query request

client.admin().cluster().prepareCancelTasks().setTaskId(taskId).get().getTasks();

リストタスクAPIを使用してtaskIdの値を検索します.
リクエストのキャンセルは通常非常に迅速なプロセスですが、数秒かかる場合があります.タスクステータスAPIは、キャンセルが完了するまでタスクをリストし続ける.
Rethrottlingedit
実行された更新でrequestspersecondの値を変更するには、reスロットルAPIを使用します.
RethrottleAction.INSTANCE.newRequestBuilder(client)

.setTaskId(taskId)

.setRequestsPerSecond(2.0f)

.get();

リストタスクAPIを使用してtaskIdの値を検索します.
 
updateByQuery APIと同様に、requestspersecondの値は任意の正のフローティング値で設定したり、POSITIVE_を使用したりすることができます.INFINITYはスロットルを無効にします.requests_per_secondの値はすぐに有効になります.スクロールタイムアウトを防止するためにrequests_per_secondは、現在のバッチが完了すると、クエリーの速度を遅くします.