这主要取决于文档的大小、客户端上的可用资源以及客户端的类型(传输客户端或节点客户端)。
节点客户端知道集群上的分片,并将文档直接发送到保存分片的节点,这些分片应该被索引。另一方面,传输客户端是一个普通客户端,它以循环方式将其请求发送到节点列表。然后,批量请求将发送到一个节点,该节点将成为索引时的网关。
由于您使用的是 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 个并发请求、无刷新间隔(设置可能有用)。