5

エラスティック検索 Java API での一括更新は、次の例外をスローします。

org.elasticsearch.action.ActionRequestValidationException: Validation Failed: 1: no requests added;
at org.elasticsearch.action.ValidateActions.addValidationError(ValidateActions.java:29)
at org.elasticsearch.action.bulk.BulkRequest.validate(BulkRequest.java:412)
at org.elasticsearch.action.support.TransportAction.execute(TransportAction.java:55)
at org.elasticsearch.action.bulk.TransportBulkAction$TransportHandler.messageReceived(TransportBulkAction.java:299)
at org.elasticsearch.action.bulk.TransportBulkAction$TransportHandler.messageReceived(TransportBulkAction.java:288)
at org.elasticsearch.transport.netty.MessageChannelHandler.handleRequest(MessageChannelHandler.java:207)
at org.elasticsearch.transport.netty.MessageChannelHandler.messageReceived(MessageChannelHandler.java:108)
at org.elasticsearch.common.netty.channel.SimpleChannelUpstreamHandler.handleUpstream(SimpleChannelUpstreamHandler.java:70)
at org.elasticsearch.common.netty.channel.DefaultChannelPipeline.sendUpstream(DefaultChannelPipeline.java:564)
at org.elasticsearch.common.netty.channel.DefaultChannelPipeline$DefaultChannelHandlerContext.sendUpstream(DefaultChannelPipeline.java:791)
at org.elasticsearch.common.netty.channel.Channels.fireMessageReceived(Channels.java:296)
at org.elasticsearch.common.netty.handler.codec.frame.FrameDecoder.unfoldAndFireMessageReceived(FrameDecoder.java:462)
at org.elasticsearch.common.netty.handler.codec.frame.FrameDecoder.callDecode(FrameDecoder.java:443)
at org.elasticsearch.common.netty.handler.codec.frame.FrameDecoder.messageReceived(FrameDecoder.java:303)
at org.elasticsearch.common.netty.channel.SimpleChannelUpstreamHandler.handleUpstream(SimpleChannelUpstreamHandler.java:70)
at org.elasticsearch.common.netty.channel.DefaultChannelPipeline.sendUpstream(DefaultChannelPipeline.java:564)
at org.elasticsearch.common.netty.channel.DefaultChannelPipeline$DefaultChannelHandlerContext.sendUpstream(DefaultChannelPipeline.java:791)
at org.elasticsearch.common.netty.OpenChannelsHandler.handleUpstream(OpenChannelsHandler.java:74)
at org.elasticsearch.common.netty.channel.DefaultChannelPipeline.sendUpstream(DefaultChannelPipeline.java:564)
at org.elasticsearch.common.netty.channel.DefaultChannelPipeline.sendUpstream(DefaultChannelPipeline.java:559)
at org.elasticsearch.common.netty.channel.Channels.fireMessageReceived(Channels.java:268)
at org.elasticsearch.common.netty.channel.Channels.fireMessageReceived(Channels.java:255)
at org.elasticsearch.common.netty.channel.socket.nio.NioWorker.read(NioWorker.java:88)
at org.elasticsearch.common.netty.channel.socket.nio.AbstractNioWorker.process(AbstractNioWorker.java:109)
at org.elasticsearch.common.netty.channel.socket.nio.AbstractNioSelector.run(AbstractNioSelector.java:312)
at org.elasticsearch.common.netty.channel.socket.nio.AbstractNioWorker.run(AbstractNioWorker.java:90)
at org.elasticsearch.common.netty.channel.socket.nio.NioWorker.run(NioWorker.java:178)
at org.elasticsearch.common.netty.util.ThreadRenamingRunnable.run(ThreadRenamingRunnable.java:108)
at org.elasticsearch.common.netty.util.internal.DeadLockProofWorker$1.run(DeadLockProofWorker.java:42)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
at java.lang.Thread.run(Thread.java:662)

以下は私が書いたコードです。

    BulkRequestBuilder bulkRequestBuilder = client.prepareBulk();

    for (String documentId : documentIds)
    {
        bulkRequestBuilder.add(client.prepareUpdate("39302", "3", documentId).setScript("ctx._source.customerName=\"Ramaraj\";"));
    }

    BulkResponse bulkResponse = bulkRequestBuilder.execute().actionGet();

これは、一括インデックスについても書いたのと同じ方法です。正常に動作していました。

前もって感謝します。

注: Java API の一括更新は、数日前に追加されたばかりです。

4

4 に答える 4

3

例外が示すように、リクエストは BulkRequest オブジェクトに追加されませんでした。for ループに追加したレコードが実際にビルダー オブジェクトに追加されているかどうかをデバッグします。同じ問題で最近この投稿を見つけました: ActionRequestValidationException

于 2013-08-20T13:50:02.900 に答える
3

この例外は、documentIds コレクションが空であるために発生します

要求を行う前に、コレクション (リスト、キューなど) にドキュメントがあるかどうかを確認する必要があります。昨日同じ問題に遭遇しました。私の場合、エラスティック検索の挿入は特定の間隔 (5 秒としましょう) で発生し、挿入コレクションが空になることはめったにありません。

私の場合、これは非常にまれな出来事であり、まれにしか発生せず(私の場合、毎日 300 万件のドキュメントが挿入されます)、本番環境に移行する前に特定するのは難しい場合があります。

私はあなたの例外を次のように処理します:

if(!documentIds.isEmpty())
{   
     BulkRequestBuilder bulkRequestBuilder = client.prepareBulk();

    for (String documentId : documentIds)
    {
        bulkRequestBuilder.add(client.prepareUpdate("39302", "3", documentId).setScript("ctx._source.customerName=\"Ramaraj\";"));
    }

    BulkResponse bulkResponse = bulkRequestBuilder.execute().actionGet();
}
于 2015-05-29T08:24:50.933 に答える
2

エラーは、リクエストがないのサイズが原因です。BulkRequestBuilderビルダーに含まれている場合はデバッグしますRequests

ここに画像の説明を入力

于 2013-11-17T20:32:36.480 に答える