Solr原子更新报错:未指定_root_处理子文档问题排查
Solr更新已有记录时的子文档
_root_报错排查指南 问题现象
- 更新已有记录时触发报错:
org.apache.solr.common.SolrException: Attempted an atomic/partial update to a child doc without indicating the _root_ somehow - 若将请求中的目标ID改为不存在的值,可正常新增记录,重复请求无异常
- 预期行为是直接替换整个文档,怀疑现有目标记录存在异常或损坏
当前环境配置
solrconfig.xml 更新请求处理器链
<updateRequestProcessorChain name="add-unknown-fields-to-the-schema" default="${update.autoCreateFields:true}" processor="uuid,remove-blank,field-name-mutating,parse-boolean,parse-long,parse-double,parse-date,add-schema-fields"> <processor class="solr.LogUpdateProcessorFactory"/> <processor class="solr.DistributedUpdateProcessorFactory"/> <processor class="solr.RunUpdateProcessorFactory"/> </updateRequestProcessorChain>
更新请求URL
POST /solr/mycore/update?commit=true
背景信息
- 未显式存储嵌套子对象,仅使用单值或字符串/数字数组字段;但将原始JSON对象字符串存入
text_en类型的Bookings字段,该字段内容较大,怀疑可能引发解析异常 - 排查中发现两个可能相关的Solr官方问题:SOLR-15468、SOLR-14923
排查重点及步骤
- 校验目标文档的实际结构:通过Solr Admin查询界面获取报错记录的完整文档(包含
_root_、_childDocuments_等系统字段),确认是否存在意外的子文档关联——即使未显式存储子对象,字段解析错误可能导致Solr误判文档为子文档类型 - 检查更新请求的格式合规性:确认更新请求体的JSON格式是否正确,尤其是
Bookings字段的JSON字符串是否被Solr误解析为实际嵌套对象(而非字符串值) - 做字段隔离测试:先尝试更新
Bookings以外的字段,看是否仍触发报错;再单独更新Bookings字段,验证是否是该大字段导致的解析问题 - 检测索引文档损坏:使用Solr Core Admin的
Check Index功能检查索引完整性;也可尝试删除目标记录后重新插入,再执行更新操作,看是否恢复正常 - 验证更新处理器逻辑:临时调整更新请求处理器链,比如移除
add-schema-fields处理器(若自动创建字段非必需),或在请求中显式添加overwrite=true参数,确认是否是自动字段创建逻辑导致的误判 - 匹配官方问题场景:参考SOLR-15468(原子更新子文档时的
_root_校验逻辑问题)和SOLR-14923(嵌套文档更新的边界场景)的触发条件,确认当前场景是否符合其中的描述
内容的提问来源于stack exchange,提问作者Andrew
相关产品推荐
相关产品推荐

