前言:
目前对es版本进行了升级,从5.5.3升级到了6.3.2 ,故对之前的集成方式做了微调。
elasticsearch Java High Level REST Client API 使用(一)
其他API使用请参考官方6.3.2文档 -> 6.3官方API
1.maven
<!--elasticsearch base-->
<dependency>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch</artifactId>
<version>6.3.2</version>
</dependency>
<!-- Java Low Level REST Client -->
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-client</artifactId>
<version>6.3.2</version>
</dependency>
<!-- Java High Level REST Client -->
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-high-level-client</artifactId>
<version>6.3.2</version>
</dependency>
2.configuration 配置
@Configuration public class ElasticsearchConfiguration implements FactoryBean<RestHighLevelClient>, InitializingBean, DisposableBean { private static final Logger LOGGER = LoggerFactory.getLogger(ElasticsearchConfiguration.class); @Value("${spring.data.elasticsearch.host}") private String host; @Value("${spring.data.elasticsearch.port}") private int port; @Value("${spring.data.elasticsearch.username}") private String username; @Value("${spring.data.elasticsearch.password}") private String password; private RestHighLevelClient restHighLevelClient; @Override public void destroy() throws Exception { try { LOGGER.info("Closing elasticSearch client"); if (restHighLevelClient != null) { restHighLevelClient.close(); } } catch (final Exception e) { LOGGER.error("Error closing ElasticSearch client: ", e); } } @Override public RestHighLevelClient getObject() throws Exception { return restHighLevelClient; } @Override public Class<RestHighLevelClient> getObjectType() { return RestHighLevelClient.class; } @Override public boolean isSingleton() { return false; } @Override public void afterPropertiesSet() throws Exception { buildClient(); } protected void buildClient() { final CredentialsProvider credentialsProvider = new BasicCredentialsProvider(); credentialsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials(username, password)); RestClientBuilder builder = RestClient.builder(new HttpHost(host, port)) .setHttpClientConfigCallback(new RestClientBuilder.HttpClientConfigCallback() { @Override public HttpAsyncClientBuilder customizeHttpClient(HttpAsyncClientBuilder httpClientBuilder) { return httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider); } }); restHighLevelClient = new RestHighLevelClient(builder); } }
3.bulkprocessor 工具类
@Service public class ElasticSearchUtil { private static final Logger LOGGER = LoggerFactory.getLogger(ElasticSearchUtil.class); @Autowired private RestHighLevelClient restHighLevelClient; private BulkProcessor bulkProcessor; @PostConstruct public void init() { BulkProcessor.Listener listener = new BulkProcessor.Listener() { @Override public void beforeBulk(long executionId, BulkRequest request) { int numberOfActions = request.numberOfActions(); LOGGER.info("Executing bulk [{}] with {} requests", executionId, numberOfActions); } @Override public void afterBulk(long executionId, BulkRequest request, BulkResponse response) { if (response.hasFailures()) { LOGGER.error("Bulk [{}] executed with failures,response = {}", executionId, response.buildFailureMessage()); } else { LOGGER.info("Bulk [{}] completed in {} milliseconds", executionId, response.getTook().getMillis()); } BulkItemResponse[] responses = response.getItems(); } @Override public void afterBulk(long executionId, BulkRequest request, Throwable failure) { LOGGER.error("Failed to execute bulk", failure); } }; BulkProcessor bulkProcessor = BulkProcessor.builder(restHighLevelClient::bulkAsync, listener) // 1000条数据请求执行一次bulk .setBulkActions(1000) // 5mb的数据刷新一次bulk .setBulkSize(new ByteSizeValue(5L, ByteSizeUnit.MB)) // 并发请求数量, 0不并发, 1并发允许执行 .setConcurrentRequests(0) // 固定1s必须刷新一次 .setFlushInterval(TimeValue.timeValueSeconds(1L)) // 重试5次,间隔1s .setBackoffPolicy(BackoffPolicy.constantBackoff(TimeValue.timeValueSeconds(1L), 5)) .build(); this.bulkProcessor = bulkProcessor; } @PreDestroy public void destroy() { try { bulkProcessor.awaitClose(30, TimeUnit.SECONDS); } catch (InterruptedException e) { LOGGER.error("Failed to close bulkProcessor", e); } LOGGER.info("bulkProcessor closed!"); } /** * 修改 * * @param request * @throws IOException */ public void update(UpdateRequest request) { this.bulkProcessor.add(request); } /** * 新增 * * @param request */ public void insert(IndexRequest request) { this.bulkProcessor.add(request); } }