0x0 背景
在项目中用到了Spring Data ElasticSearch,最近更新到了最新版本5.0.x,在数据插入、修改、删除后,紧接着进行查询发现数据并未更新;
0x1 解决方法
研究后发现是新版本的spring data es默认的刷新策略是null,代码如下:
@Bean
@ConditionalOnMissingBean(value = ElasticsearchOperations.class, name = "elasticsearchTemplate")
@ConditionalOnBean(ElasticsearchClient.class)
ElasticsearchTemplate elasticsearchTemplate(ElasticsearchClient client, ElasticsearchConverter converter) {
return new ElasticsearchTemplate(client, converter);
}
这里没有给ElasticsearchTemplate设置refreshPolicy属性,点进AbstractElasticsearchTemplate可以看到默认为null,而以前默认是立即刷新IMMEDIATE。
查看Spring官网发现
Refresh configuration
When configuring Spring Data Elasticsearch like described in Elasticsearch Clients by using
ElasticsearchConfigurationSupport
,AbstractElasticsearchConfiguration
orAbstractReactiveElasticsearchConfiguration
the refresh policy will be initialized tonull
. Previously the reactive code initialized this toIMMEDIATE
, now reactive and non-reactive code show the same behaviour.
也就是说,对es数据库进行数据变更操作时,默认是按照索引自带的刷新策略(一般情况下是1s以后才会更新索引)
{
"settings": {},
"defaults": {
"index": {
"refresh_interval": "1s"
}
}
}
如果想要在Spring data es中更新数据后立即刷新,那么需要如下配置覆盖掉Springboot的Auto Configuration:
@Configuration
@EnableConfigurationProperties(ElasticsearchProperties.class)
public class ElasticsearchConfig extends ElasticsearchConfiguration {
private final ElasticsearchProperties properties;
public ElasticsearchConfig(ElasticsearchProperties properties) {
this.properties = properties;
}
@NotNull
@Override
public ClientConfiguration clientConfiguration() {
List<String> uris = properties.getUris();
String[] uri = uris.toArray(new String[0]);
return ClientConfiguration.builder()
.connectedTo(uri)
.withSocketTimeout(properties.getSocketTimeout())
.withConnectTimeout(properties.getConnectionTimeout())
.build();
}
@NotNull
@Bean(name = { "elasticsearchOperations", "elasticsearchTemplate" })
@Override
public ElasticsearchOperations elasticsearchOperations(@NotNull ElasticsearchConverter elasticsearchConverter,
@NotNull ElasticsearchClient elasticsearchClient) {
ElasticsearchTemplate template = new ElasticsearchTemplate(elasticsearchClient, elasticsearchConverter);
template.setRefreshPolicy(RefreshPolicy.IMMEDIATE);
return template;
}
}
网友评论