2014-06-17 2 views
0
<arr name="itemDescSpell"> 
<str>Cable Tie, 4.0L (102mm), Miniature, Nyl</str> 
<str>Cable Tie, 4.0L (102mm), Miniature, Nyl</str> 
</arr> 

입니다. 이는 Solr Document가 매번 업데이트 될 때 오류를 일으 킵니다. 내가 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

setField를 사용한다는 것입니다? –

답변

0

사용자 정의 UpdateRequestProcessor를 사용하여 itemDescSpell 필드에있는 값을 덮어 쓰십시오.

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")); 
     } 
    } 
} 

을 : SOLR는 copyfield 대상이 이미 채워져 때 얻을 예외가 발생합니다, 그래서 당신이하고 싶은 스키마에서 copyField 라인을 제거하고 같이 할 수 귀하의 설정에 사용자 정의 UpdateRequestProcessor를 추가입니다 이것은 제작 준비가되지 않은 코드이지만 최종 코드가 어떻게 나타나야하는지에 대한 아이디어를 제공해야합니다. 필드 값을 사용자 정의하려면 팩토리에서 init 메소드를 겹쳐 쓰고이를 구성에 전달하십시오.

의 주요 차이점

는 copyField가 발생할 때 SOLR이 addField를 사용하고,이 클래스가 itemDescSpell 필드 유형이 스키마에 정의되는 방법

+0

나는이 문제를 해결하기 위해 solr version 4.0을 사용했다. 이제 4.3 버전으로 업데이트했다. 작동한다. – user3747915

관련 문제