如何覆盖Solr文档字段?

时间:2014-06-17 09:49:43

标签: solr

<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

1 个答案:

答案 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