如何为Spring Data Elasticsearch 4.4.x配置RefreshPolicy以避免刷新调用
问题
通过继承ElasticsearchRepository创建仓库并添加自定义方法后,已将RefreshPolicy设置为WAIT_UNTIL以避免额外调用Elasticsearch的/_refresh API,但调用repository.save()或repository.deleteByIdentifier1()时仍会触发该API调用。
需实现:不自行重写仓库方法的前提下,阻止仓库任意方法调用触发刷新请求。根据Spring Data Elasticsearch文档,仓库应使用已配置的RefreshPolicy。
仓库代码:
@Repository public interface MyRepository extends ElasticsearchRepository<MyModel, String> { Optional<MyModel> findByIdentifier1(String identifier1); void deleteByIdentifier1(String identifier1); }
Elasticsearch模板与HLRC配置:
@Bean public RestHighLevelClient buildClient() { final CredentialsProvider credentialsProvider = new BasicCredentialsProvider(); credentialsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials(properties.getUsername(), properties.getPassword())); RestClientBuilder restclientbuilder = RestClient .builder(new HttpHost(properties.getHost(), properties.getPort(), properties.getProtocol())); restclientbuilder.setHttpClientConfigCallback(httpClientBuilder -> httpClientBuilder.disableAuthCaching() .setDefaultCredentialsProvider(credentialsProvider)); return new RestHighLevelClient(restclientbuilder); } @Bean(name = "elasticsearchTemplate") public ElasticsearchRestTemplate template(RestHighLevelClient client) { ElasticsearchRestTemplate template = new ElasticsearchRestTemplate(client); template.setRefreshPolicy(org.springframework.data.elasticsearch.core.RefreshPolicy.WAIT_UNTIL); return template; } @Bean RefreshPolicy refreshPolicy() { return RefreshPolicy.WAIT_UNTIL; }
依赖版本:
- spring-boot-starter-data-elasticsearch 2.7.12
- spring-data-elasticsearch 4.4.12
- elasticsearch-rest-high-level-client 7.17.3
解决方案
1. 修正RefreshPolicyBean的类型
当前定义的RefreshPolicyBean属于Elasticsearch客户端原生类型,而Spring Data Elasticsearch需要使用自身封装的org.springframework.data.elasticsearch.core.RefreshPolicy。修改Bean定义:
@Bean org.springframework.data.elasticsearch.core.RefreshPolicy springDataRefreshPolicy() { return org.springframework.data.elasticsearch.core.RefreshPolicy.WAIT_UNTIL; }
此Bean会被SimpleElasticsearchRepository自动拾取,覆盖默认的IMMEDIATE策略,避免触发/_refresh。
2. 通过配置文件全局设置(推荐)
直接在application.properties或application.yml中添加全局配置,无需编写Java Bean:
spring.data.elasticsearch.refresh-policy=WAIT_UNTIL
YAML格式:
spring: data: elasticsearch: refresh-policy: WAIT_UNTIL
该配置会自动应用到所有ElasticsearchRepository和ElasticsearchRestTemplate,确保所有写操作使用指定的刷新策略。
3. 验证仓库与模板的关联
确保MyRepository正确注入了配置的elasticsearchTemplateBean。默认情况下,仓库会自动关联名为elasticsearchTemplate的模板,若存在多个模板,可通过@Qualifier显式指定:
@Repository public interface MyRepository extends ElasticsearchRepository<MyModel, String> { Optional<MyModel> findByIdentifier1(String identifier1); void deleteByIdentifier1(String identifier1); }
内容的提问来源于stack exchange,提问作者boredDev

