0x0 背景
在項(xiàng)目中用到了Spring Data ElasticSearch,最近更新到了最新版本5.0.x,在數(shù)據(jù)插入、修改、刪除后,緊接著進(jìn)行查詢發(fā)現(xiàn)數(shù)據(jù)并未更新;
0x1 解決方法
研究后發(fā)現(xiàn)是新版本的spring data es默認(rèn)的刷新策略是null,代碼如下:
@Bean
@ConditionalOnMissingBean(value = ElasticsearchOperations.class, name = "elasticsearchTemplate")
@ConditionalOnBean(ElasticsearchClient.class)
ElasticsearchTemplate elasticsearchTemplate(ElasticsearchClient client, ElasticsearchConverter converter) {
return new ElasticsearchTemplate(client, converter);
}
這里沒有給ElasticsearchTemplate設(shè)置refreshPolicy屬性,點(diǎn)進(jìn)AbstractElasticsearchTemplate可以看到默認(rèn)為null,而以前默認(rèn)是立即刷新IMMEDIATE。
查看Spring官網(wǎng)發(fā)現(xiàn)
Refresh configuration
When configuring Spring Data Elasticsearch like described in Elasticsearch Clients by using
ElasticsearchConfigurationSupport,AbstractElasticsearchConfigurationorAbstractReactiveElasticsearchConfigurationthe refresh policy will be initialized tonull. Previously the reactive code initialized this toIMMEDIATE, now reactive and non-reactive code show the same behaviour.
也就是說,對(duì)es數(shù)據(jù)庫進(jìn)行數(shù)據(jù)變更操作時(shí),默認(rèn)是按照索引自帶的刷新策略(一般情況下是1s以后才會(huì)更新索引)
{
"settings": {},
"defaults": {
"index": {
"refresh_interval": "1s"
}
}
}
如果想要在Spring data es中更新數(shù)據(jù)后立即刷新,那么需要如下配置覆蓋掉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;
}
}