Mass update via elastic search Java API eliminates exception

Bulk update in elastic search Java Api throws the following exception.

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) 

Below is the code I wrote.

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

This is the same as for the mass index. It worked fine.

Thanks in advance.

Note. Mass update in java api is added just a few days ago.

+4
source share
3 answers

As indicated in the exception, no queries were added to the BulkRequest object. Debugging if the entries you add in the for loop are actually added to the builder. This post has recently been found with the same issue: ActionRequestValidationException

+3
source

The error is related to the size of your BulkRequestBuilder , which has no queries. Debugging if your builder contains Requests

enter image description here

+2
source

This exception occurs because the documentIds collection is empty .

You should check if your collection (list, queue, etc.) has documents before executing the request. I faced the same problem yesterday, in my case, inserts with elastic search happen in a given interval (say, 5 s), and not that the insert collection was not empty;

In my case, this is a very rare occurrence, and it will rarely be rare (in my case, 3 million documents inserted every day), and it can be difficult to identify before moving on to production.

I would handle your exceptions as follows:

 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(); } 
+2
source

Source: https://habr.com/ru/post/1488500/


All Articles