2014-06-17 30 views
0
<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"如何覆蓋Solr文檔字段?

在架構

,copyField定義像下面

<field name="itemDescSpell" type="textSpell"/> 
    <copyField source="description" dest="itemDescSpell"/> 

的錯誤是:

multiple values encountered for non multiValued field itemDescSpell. 

是任何人能幫助我解決這個問題通過SolrJ,同時保持此字段類型爲textSpell

+0

在架構中是如何定義的itemDescSpell字段類型? –

回答

0

嘗試使用自定義UpdateRequestProcessor來覆蓋itemDescSpell字段中存在的值。 Solr的將拋出你當已經被填充的copyfield目的地的異常,所以你想要做的是從你的架構中刪除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的使用激活addField遇到copyField時,這個類使用setField

+0

我解決了這個問題,我使用了solr版本4.0,所以它導致了問題。現在我更新到4.3版本。它的工作原理 – user3747915