Solr更新已有文档的嵌套字段时触发空指针异常该如何解决
Solr新增嵌套字段执行原子更新报错问题排查
错误原因及解决方法
1. 基础XML语法错误
你提交的更新XML存在标签闭合错误:
<field name="name">color/field>
此处缺少闭合标签的左尖括号,正确写法为:
<field name="name">color</field>
该语法错误会导致Solr的XML加载器解析字段值异常,是触发空指针异常的直接诱因之一。
2. 嵌套字段Schema配置不符合要求
要实现你期望的嵌套对象结构,schema必须满足以下配置要求,配置缺失会导致更新处理器读取字段定义时空指针:
- 嵌套对象字段需定义为
nested类型:
<field name="attributes" type="nested" stored="true" indexed="true" multiValued="true"/>
- 嵌套对象内部字段需单独定义,或配置对应动态字段规则:
<!-- 动态字段适配所有attributes下的子字段 --> <field name="attributes.*" type="string" stored="true" indexed="true"/> <!-- 也可单独定义每个子字段 --> <field name="attributes.id" type="string" stored="true" indexed="true"/> <field name="attributes.name" type="string" stored="true" indexed="true"/> <field name="attributes.value" type="string" stored="true" indexed="true"/>
- 原有文档的所有字段必须设置
stored="true",原子更新依赖存储字段读取原有文档内容。
3. 嵌套文档原子更新的XML写法错误
Solr的XML更新格式不支持直接在嵌套父字段内包裹子字段加update="add"的写法,正确的写法需要给子文档加上type="child"标识:
<add> <doc> <field name="id">9</field> <doc type="child" fieldName="attributes"> <field name="id">1</field> <field name="name">color</field> <field name="value">red</field> </doc> <doc type="child" fieldName="attributes"> <field name="id">2</field> <field name="name">size</field> <field name="value">20</field> </doc> </doc> </add>
4. 版本兼容性注意
如果你使用的Solr版本低于7.4,原生不支持嵌套字段的原子更新操作,需要全量覆盖更新整个文档,不能使用部分更新的方式新增嵌套字段。
内容的提问来源于stack exchange,提问作者Samy
相关产品推荐
相关产品推荐

