elasticsearch批量插入

@Scope
@Slf4j
@Component
public class ESBulkProcessorConfig {

	@Value("${spring.elasticsearch.rest.uris}")
	private String hostlist;

	@Bean
	public RestHighLevelClient restHighLevelClient() {
		//解析hostlist配置信息
		String[] split = hostlist.split(",");
		
		//创建HttpHost数组,其中存放es主机和端口的配置信息
		HttpHost[] httpHostArray = new HttpHost[split.length];
		for(int i=0;i<split.length;i++){
			String item = split[i];
			System.out.println(item);
			httpHostArray[i] = new HttpHost(item.split(":")[0],
			Integer.parseInt(item.split(":")[1]), "http");
		}
		// 构建连接对象
		RestClientBuilder builder = RestClient.builder(httpHost);

		// 异步连接延时配置
		builder.setRequestConfigCallback(requestConfigBuilder -> {
			requestConfigBuilder.setConnectTimeout(2000);
			requestConfigBuilder.setSocketTimeout(30000);
			requestConfigBuilder.setConnectionRequestTimeout(1000);
			return requestConfigBuilder;
		});

		// 异步连接数配置
		builder.setHttpClientConfigCallback(httpClientBuilder -> {
			CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
			String esUser = esConfig.getUsername();
			String esPwd = esConfig.getPassword();
			if (StrUtil.isAllNotBlank(esUser, esPwd)) {
				credentialsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials(esUser, esPwd));
				httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider);
			}	
			httpClientBuilder.setMaxConnTotal(200);
			httpClientBuilder.setMaxConnPerRoute(1000);
			return httpClientBuilder;
		});
			
		//创建RestHighLevelClient客户端
		return new RestHighLevelClient(builder);
	}

	@Bean
	public BulkProcessor bulkProcessor() {
		RestHighLevelClient client = restHighLevelClient();
		BiConsumer<BulkRequest, ActionListener<BulkResponse>> bulkConsumer =
				(request, bulkListener) -> client.bulkAsync(request, RequestOptions.DEFAULT, bulkListener);

		return BulkProcessor.builder(bulkConsumer, new BulkProcessor.Listener() {
					@Override
					public void beforeBulk(long l, BulkRequest bulkRequest) {
						// to do something....
						int i = request.numberOfActions();
                        log.error("ES 同步数量{}",i);
					}
					@Override
					public void afterBulk(long l, BulkRequest bulkRequest, BulkResponse bulkResponse) {
						log.info("bulk  fail: {}", bulkResponse.buildFailureMessage());
						if (bulkResponse.hasFailures()) {
						  // to do something....
						}else {
						  // to do something....
						}   
					}
					@Override
					public void afterBulk(long l, BulkRequest bulkRequest, Throwable throwable) {
						// to do something....
						log.error("写入ES 重新消费");
					}
				}).setBulkActions(1000)
				.setBulkSize(new ByteSizeValue(2, ByteSizeUnit.MB))
				.setFlushInterval(TimeValue.timeValueSeconds(5))
				.setConcurrentRequests(8)
				.setBackoffPolicy(BackoffPolicy.exponentialBackoff(TimeValue.timeValueMinutes(5), 0))
				.build();
		}
	}

批量插入操作

	@Resource
	private BulkProcessor bulkProcessor;

	...	...(){
	// 批量插入ES
    for(Entity entity : entityList){
		bulkProcessor.add(new IndexRequest("你的索引").source(JSONUtil.toJsonStr(entity), XContentType.JSON));		
	 }
   }

BulkProcessor类详细参考: link

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Elasticsearch中进行批量插入可以提高插入数据效率。以下是一种常见的批量插入数据的方法: 1. 使用Bulk API:Elasticsearch提供了Bulk API来支持批量操作。通过Bulk API,可以将多个操作(如插入、更新、删除)打包成一个请求发送给Elasticsearch,从而减少网络开销和提高性能。 下面是一个使用Bulk API进行批量插入的示例代码: ```java import org.elasticsearch.action.bulk.BulkRequest; import org.elasticsearch.action.bulk.BulkResponse; import org.elasticsearch.action.index.IndexRequest; import org.elasticsearch.client.RequestOptions; import org.elasticsearch.client.RestHighLevelClient; import org.elasticsearch.common.xcontent.XContentType; import java.io.IOException; public class BulkInsertExample { public static void bulkInsert(RestHighLevelClient client) throws IOException { BulkRequest bulkRequest = new BulkRequest(); // 添加多个插入请求 bulkRequest.add(new IndexRequest("index_name").id("1").source("{\"field1\":\"value1\"}", XContentType.JSON)); bulkRequest.add(new IndexRequest("index_name").id("2").source("{\"field2\":\"value2\"}", XContentType.JSON)); bulkRequest.add(new IndexRequest("index_name").id("3").source("{\"field3\":\"value3\"}", XContentType.JSON)); BulkResponse bulkResponse = client.bulk(bulkRequest, RequestOptions.DEFAULT); if (bulkResponse.hasFailures()) { // 处理错误 System.out.println("批量插入失败:" + bulkResponse.buildFailureMessage()); } else { // 处理成功 System.out.println("批量插入成功"); } } } ``` 在上面的示例中,我们首先创建了一个BulkRequest对象,然后通过add方法添加多个IndexRequest对象,每个IndexRequest对象表示一个插入请求。最后,我们使用RestHighLevelClient的bulk方法执行批量插入操作。 需要注意的是,上述示例中的index_name需要替换为实际的索引名称,而id和source字段则是具体的文档ID和文档内容。 另外,还可以使用其他方法进行批量插入,比如使用Elasticsearch的BulkProcessor或者使用第三方库(如Elasticsearch Bulk Processor)来简化批量插入操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值