Sitecore取消发布条目未从自定义Solr索引移除技术求助
Sitecore 9.0.2 SxaItemCrawler 取消发布后条目未从自定义Solr索引移除问题解决
问题分析
从你提供的日志和配置信息来看,核心问题出在Sitecore.XA.Foundation.VersionSpecific.Search.SxaItemCrawler的IsExcludedFromIndex方法上。当你取消发布条目时,该条目会从web数据库中被删除,但索引更新任务仍会尝试读取这个已不存在的条目,导致空引用异常——这直接中断了索引删除流程,所以新增/更新功能正常,但删除操作完全失效。
解决方案
方法1:自定义SxaItemCrawler处理空条目
最彻底的解决方式是继承原爬虫类,重写关键方法添加空条目判断逻辑,避免空引用异常:
using Sitecore.XA.Foundation.VersionSpecific.Search; using Sitecore.ContentSearch; using Sitecore.Data.Items; public class CustomSxaItemCrawler : SxaItemCrawler { protected override bool IsExcludedFromIndex(IIndexableUniqueId indexableUniqueId, IndexEntryOperationContext operationContext, bool checkLocation) { // 先尝试获取目标条目,若条目不存在直接返回false(允许删除操作执行) var targetItem = GetTargetItem(indexableUniqueId, operationContext); if (targetItem == null) { return false; } // 条目存在时,执行原逻辑判断是否需要排除 try { return base.IsExcludedFromIndex(indexableUniqueId, operationContext, checkLocation); } catch (NullReferenceException) { // 兜底捕获异常,确保删除流程不中断 return false; } } private Item GetTargetItem(IIndexableUniqueId indexableUniqueId, IndexEntryOperationContext operationContext) { var sitecoreId = indexableUniqueId as SitecoreIndexableUniqueId; if (sitecoreId == null) { return null; } var targetDb = GetDatabase(operationContext); return targetDb?.GetItem(sitecoreId.ItemId, sitecoreId.Language); } }
然后修改你的自定义索引配置,将爬虫类型替换为自定义实现:
<locations hint="list:AddCrawler"> <crawler type="YourProject.Namespace.CustomSxaItemCrawler, YourProject.AssemblyName"> <Database>web</Database> <Root>/sitecore/content/customer-Main/customer-Main/Home</Root> </crawler> <crawler type="YourProject.Namespace.CustomSxaItemCrawler, YourProject.AssemblyName"> <Database>web</Database> <Root>/sitecore/content/customer-Main/customer-Main/Data/Product Content/</Root> </crawler> </locations>
部署自定义程序集后重启Sitecore,测试取消发布操作,索引就能正常移除对应条目了。
方法2:安装XA官方补丁
这个问题大概率是Sitecore XA版本的已知bug,你可以查看Sitecore官方知识库,确认是否有针对Sitecore 9.0.2 + 对应XA版本的修复补丁。安装官方补丁是更稳妥的长期方案,前提是有对应的补丁可用。
方法3:临时应急方案(手动重建索引)
如果需要快速恢复业务,可以手动触发自定义索引重建:
- 登录Sitecore后台,进入Control Panel → Indexing → Index Manager
- 找到
customer_sxa_web_index,点击Rebuild
但这只是临时 workaround,无法从根源解决取消发布时的自动删除问题。
验证步骤
完成修改后,按以下流程验证:
- 发布一个测试条目,确认它被正常加入Solr索引
- 取消发布该条目,检查web数据库中是否已删除该条目
- 查询Solr索引,确认该条目已被移除
- 查看Sitecore日志,确认不再出现空引用异常
内容的提问来源于stack exchange,提问作者Sarah
相关产品推荐
相关产品推荐

