Spring Data Elasticsearch4.2.2是否支持IndexOperations层别名原子切换操作
问题解答
特性支持情况
spring-data-elasticsearch 4.2.2版本已经支持索引别名的原子切换操作,IndexOperations类提供的alias(AliasActions actions)方法底层直接调用Elasticsearch原生的原子别名操作接口,你提交的多个别名修改动作(移除旧索引绑定、添加新索引绑定)会作为一个原子请求执行,要么全部生效要么全部失败,完全符合重索引场景的切换需求。
报错原因与解决方案
你遇到的NoSuchMethodError异常和spring-data-elasticsearch的功能支持无关,是Elasticsearch官方客户端依赖版本不兼容导致的:
- spring-data-elasticsearch 4.2.2默认适配的Elasticsearch客户端版本为7.12.1,
isHidden方法是Elasticsearch 7.7及以上版本才在IndicesAliasesRequest.AliasActions类中新增的方法 - 你项目中实际引入的Elasticsearch官方Java客户端版本低于7.7,导致运行时找不到对应方法
你可以按照以下步骤解决:
- 排查项目的依赖树,排除所有低版本的Elasticsearch客户端传递依赖,统一使用和spring-data-elasticsearch 4.2.2匹配的7.12.1版本客户端
- 补充优化点:如果你的需求只是把旧索引从别名上解绑、不需要删除旧索引,不要用
AliasAction.RemoveIndex(这个动作会直接删除旧索引),替换为AliasAction.Remove即可,修改后的参考代码如下:
var aliasActions = new AliasActions() // 仅将旧索引从别名移除,不删除旧索引 .add(new AliasAction.Remove(AliasActionParameters.builder() .withIndices(oldIndexName) .withAliases(indexOps.getIndexCoordinates().getIndexNames()) .build())) .add(new AliasAction.Add( AliasActionParameters.builder().withIndices(newIndexName) .withAliases(indexOps.getIndexCoordinates().getIndexNames()).build())); // 执行原子切换 indexOps.alias(aliasActions);
内容的提问来源于stack exchange,提问作者JLumos
相关产品推荐
相关产品推荐

