Spring Data Elasticsearch出现pit/search_after was cancelled警告的原因及解决方法
警告含义
这个警告来自Spring Data Elasticsearch的ReactiveElasticsearchTemplate,意思是基于PIT(Point In Time)的search_after分页操作被取消了。PIT是Elasticsearch用来实现高效、一致分页的机制,Spring Data Elasticsearch 5.x默认会用它处理分页查询,但在你的场景中,该操作因兼容问题没能正常完成,被主动终止。
版本差异是核心诱因
没错,版本不兼容就是问题根源:
- Spring Boot 3.2.0搭配的Spring Data Elasticsearch 5.2.0,是为Elasticsearch 8.x版本设计的,底层依赖的Elasticsearch客户端也是8.x系列。
- 你的Elasticsearch运行在7.17.8,属于7.x的最终版本,和8.x客户端在PIT的交互逻辑、请求格式上存在差异。8.x客户端发送的PIT相关请求,7.17.8节点无法正确处理,最终导致客户端主动取消操作并输出警告。
解决办法
根据实际场景选择以下方案:
1. 禁用PIT分页(快速解决)
在代码中显式禁用PIT,让查询回到兼容7.17.8的分页方式。比如构建响应式查询时添加禁用选项:
ReactiveQuery query = ReactiveQuery.builder(yourCriteria) .withOptions(ElasticsearchQueryOptions.builder().usePit(false).build()) .build();
这样ReactiveElasticsearchTemplate就不会触发PIT相关操作,警告自然消失。
2. 升级Elasticsearch到8.x(长期最优)
直接把Elasticsearch升级到和Spring Data Elasticsearch 5.2.0匹配的版本(推荐8.11.x系列,与Spring Boot 3.2.x适配性最好),彻底解决跨版本兼容问题,同时能用到ES 8.x的新特性。
3. 降级Spring生态版本(迫不得已的选择)
如果暂时无法升级ES,可以把Spring Boot降级到2.7.x系列,对应的Spring Data Elasticsearch是4.4.x——这个版本专门适配Elasticsearch 7.17.x,不会出现PIT兼容问题。但该方案需要调整整个项目的Spring版本,成本较高。
4. 屏蔽警告(临时治标)
如果只是不想看到日志,又不想改动代码或版本,可以调整日志配置,把org.springframework.data.elasticsearch.client.elc.ReactiveElasticsearchTemplate的日志级别设为ERROR,这样警告信息就不会输出了。但这只是掩盖问题,不解决本质。
内容的提问来源于stack exchange,提问作者Piotr Kozlowski

