ElasticsearchRepository.refresh()已废弃,该用什么方法替代?
Spring Data Elasticsearch 4.4.1 废弃Repository.refresh()替换方案
Spring Data Elasticsearch 从4.2版本开始就将ElasticsearchRepository.refresh()标记为废弃,4.4.1版本中该方法仍存在但不推荐使用,官方将索引刷新这类索引运维类能力从Repository层下沉,统一收敛到ElasticsearchOperations的索引操作入口中。
完全等价原有逻辑的替换写法
原有save后手动刷新的逻辑,不需要调整save调用逻辑,只需要将原来直接调用Repository的refresh()方法,替换为注入ElasticsearchOperations实例后通过索引操作对象执行刷新,效果和原方法完全一致:
// 原有Repository的save调用保持不变 elasticsearchRepository.save(targetEntity); // 替换原refresh()调用,传入Repository对应的实体类即可关联到对应索引 elasticsearchOperations.indexOps(YourEntity.class).refresh();
更优的刷新实现(可选)
如果只是要保证刚写入的数据立即可被检索,不需要单独拆分刷新调用,可以直接在写入操作时指定刷新策略,减少一次单独的请求交互,写入性能更高:
IndexQuery indexQuery = new IndexQueryBuilder() .withId(targetEntity.getId()) .withObject(targetEntity) .build(); // 写入时指定IMMEDIATE刷新策略,写入完成后立即刷新对应分片,数据立即可查 elasticsearchOperations.index(indexQuery, IndexCoordinates.of(YourEntity.class), RefreshPolicy.IMMEDIATE);
刷新策略说明
RefreshPolicy.IMMEDIATE:强制立即刷新,和原有代码调用refresh的效果完全一致,写入数据立即可搜索RefreshPolicy.NONE:默认策略,不触发强制刷新,依赖Elasticsearch默认的1秒间隔自动刷新,写入性能最高,适合非强实时性的业务场景RefreshPolicy.WAIT_UNTIL:写入后等待下一次自动刷新完成再返回,不会主动触发刷新,适合对实时性有一定要求但不想增加刷新开销的场景
注:官方废弃Repository层refresh()的核心原因是仓储接口本身应该聚焦数据读写的领域能力,索引创建、刷新、mapping管理这类索引运维操作不属于Repository的职责范畴,因此统一收敛到
IndexOperations入口做统一管理,职责边界更清晰。
内容的提问来源于stack exchange,提问作者Abe
相关产品推荐
相关产品推荐

