美文网首页
Spring Data Elasticsearch 5.0.x修

Spring Data Elasticsearch 5.0.x修

作者: TinyThing | 来源:发表于2023-05-07 08:44 被阅读0次

    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 or AbstractReactiveElasticsearchConfiguration the refresh policy will be initialized to null. Previously the reactive code initialized this to IMMEDIATE, 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;
        }
    
    }
    
    
    

    相关文章

      网友评论

          本文标题:Spring Data Elasticsearch 5.0.x修

          本文链接:https://www.haomeiwen.com/subject/xtnxsdtx.html