You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SolrJ 8.5.1对接Solr Server 8.8.2执行hard commit不生效问题咨询

SolrJ 8.5.1对接Solr 8.8.2删除提交后文档仍可查询问题解答

问题描述

我在使用SolrJ 8.5.1对接Solr Server 8.8.2时遇到一个偶发但特定服务器可稳定复现的异常,目前不确定是否是预期行为,复现代码如下:

String docId = "someKey";
SolrInputDocument inputDocument = createDocument(docId);
SolrClient solrClient = getClient();

solrClient.add(inputDocument);

// 根据API定义,第三个参数false代表硬提交,试过无参commit()效果一致
solrClient.commit(true, true, false);

System.out.println(solrClient.getById(docId));

solrClient.deleteById(docId);
// 同上,调用硬提交
solrClient.commit(true, true, false);

// 这里预期输出null,但实际仍然能查到刚删除的文档
System.out.println(solrClient.getById(docId));

代码执行输出如下:

[id:someKey, reference:fooId44, scale:1, managerId:like, vote:1, version:1717398236211183616]
[id:someKey, reference:fooId44, scale:1, managerId:like, vote:1, version:1717398236211183616]

从现象上看commit()的表现更像软提交而非指定的硬提交,我翻了Solr官方升级说明没有找到相关记录,请问这是旧版SolrJ对接高版本Solr服务的已知兼容问题吗?


问题解答

这不是SolrJ 8.x和Solr Server 8.x跨小版本对接的已知兼容问题,可按以下方向排查根因:

  • 首先确认对应Core的solrconfig.xml提交配置:检查是否开启了<autoSoftCommit>,如果maxTime设置值极低(如低于100ms),会存在自动软提交和你手动硬提交的时序冲突,可能导致删除操作的可见性未被正确刷新;另外排查是否有自定义请求处理器拦截了commit请求,强制把所有提交改为软提交。
  • 如果使用的是SolrCloud集群,大概率是副本同步延迟导致:你的删除和commit请求发送到了Leader节点,但getById请求被路由到了还没同步到删除操作的Follower节点,可在调用查询时添加replicaType=LEADER参数强制走Leader查询验证,如果此时返回符合预期的null,就可以确认是副本同步策略的问题。
  • 可通过Solr Admin的日志页面验证提交类型:调用commit后查看服务端日志,硬提交会明确标记HARD COMMIT且有fsync相关记录,软提交会标记SOFT COMMIT,可确认你发送的硬提交请求是否被服务端正确识别执行。
  • 临时关闭自动提交验证:测试时临时关闭对应Core的自动软提交、自动硬提交配置,再跑测试用例,如果问题消失,即可确认是服务端自动提交策略和手动提交冲突导致,和版本兼容性无关。

内容的提问来源于stack exchange,提问作者Simon Urli

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 12:15:02