它主要取决于您的文档的大小、客户端上的可用资源以及客户端的类型(传输客户端或节点客户端)。
节点客户端知道集群上的分片,并将文档直接发送到保存分片的节点,这些分片应该被索引。另一方面,传输客户端是一个普通客户端,它以循环方式将其请求发送到节点列表。然后批量请求将被发送到一个节点,该节点将成为索引时的网关。
由于您使用的是 Java API,我建议您看一下BulkProcessor
,这使得批量索引变得更加容易和灵活。您可以定义自上次批量执行以来的最大操作数、最大大小和最大时间间隔。它会在需要时自动为您执行批量操作。您还可以设置最大并发批量请求数。
在你创建BulkProcessor
这样的之后:
BulkProcessor bulkProcessor = BulkProcessor.builder(client, new BulkProcessor.Listener() {
@Override
public void beforeBulk(long executionId, BulkRequest request) {
logger.info("Going to execute new bulk composed of {} actions", request.numberOfActions());
}
@Override
public void afterBulk(long executionId, BulkRequest request, BulkResponse response) {
logger.info("Executed bulk composed of {} actions", request.numberOfActions());
}
@Override
public void afterBulk(long executionId, BulkRequest request, Throwable failure) {
logger.warn("Error executing bulk", failure);
}
}).setBulkActions(bulkSize).setConcurrentRequests(maxConcurrentBulk).build();
您只需向其中添加您的请求:
bulkProcessor.add(indexRequest);
并在最后关闭它以刷新可能尚未执行的任何最终请求:
bulkProcessor.close();
最后回答您的问题:关于BulkProcessor
它的好处还在于它具有合理的默认值:5 MB 大小、1000 个操作、1 个并发请求、无刷新间隔(这可能对设置有用)。