You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 20:52:51