<arr name="itemDescSpell">
<str>Cable Tie, 4.0L (102mm), Miniature, Nyl</str>
<str>Cable Tie, 4.0L (102mm), Miniature, Nyl</str>
</arr>
itemDescSpell
copyField
,每次更新Solr文档时都会导致错误。我不想将字段设为multiValued="true"
在架构中,copyField定义如下
<field name="itemDescSpell" type="textSpell"/>
<copyField source="description" dest="itemDescSpell"/>
错误是:
multiple values encountered for non multiValued field itemDescSpell.
是否有人能够帮助我通过SolrJ解决此问题,同时将此字段类型保持为textSpell
?
答案 0 :(得分:0)
尝试使用自定义UpdateRequestProcessor覆盖itemDescSpell字段中的值。 Solr将抛出在填充了复制域目标时获得的异常,因此您要做的是从架构中删除copyField行,并将自定义UpdateRequestProcessor添加到您的配置中,如下所示:
public class CustomFactory extends UpdateRequestProcessorFactory {
@Override
public UpdateRequestProcessor getInstance(SolrQueryRequest req, SolrQueryResponse rsp, UpdateRequestProcessor next) {
return new Custom(next);
}
public class Custom extends UpdateRequestProcessor {
public Custom(UpdateRequestProcessor next){
super(next);
}
@Override
public void processAdd(AddUpdateCommand cmd) throws IOException {
cmd.solrDoc.setField("foo",cmd.solrDoc.getFieldValue("bar"));
}
}
}
这不是生产就绪代码,但它可以让您了解最终代码的外观。要自定义字段值,您可以覆盖工厂上的init方法并在配置中传递它们。
主要区别在于solr在遇到copyField时使用addField,并且此类使用setField