2013-11-27 2 views
1

15 초마다 자동 커밋을 사용하는 단일 SOLR 서버 (클라우드가 아님)가 있습니다. 많은 문서를 색인에 추가 한 후에 일부 필드를 변경하려고합니다. 이 변경은 매우 커서 ~ 40 개의 스레드로 수행해야합니다.concurrentUpdateSolrServer 및 원자 적 업데이트를 사용하여 SOLR 업데이트가 손실되었습니다.

모든 스레드에 대해 하나의 concurrentUpdateSolrServer를 사용합니다. 나는 1000 개의 문서를 모두 내리고 내부적으로 48 개의 쓰레드를 사용하도록이 서버를 설정했다. (내 스레드가 아님).

다중 값 필드에 값을 추가하려면 원자 추가를 사용했습니다.

~ 5000 개의 문서를 업데이트 한 후 프로세스가 중지됩니다. 나가기 전에 commit + blockUntilFinshed + shutdown을 호출합니다.

SOLR 서버를 쿼리 할 때 ~ 200 개의 문서 만 업데이트를받는 것으로 보입니다.

나는 또한 단지 하나의 스레드 (내 스레드 - 여전히 업데이트 서버의 48 개)와 여전히 동일한 문제로이 문제를 해결했습니다.

concurrentUpdateSolrServer에서 HttpSolrServer (1 thread)로 변경할 때 정상적으로 작동합니다.

+0

로그에 얼마나 많은 커밋/추가가 표시됩니까? – MatsLindh

답변

3

OK 그것을 해결 :

실수는 내가 업데이트 싶었던 SolrDocument 있었다 - 그래서 나는 SolrInputDocumnt로 변환 :

SolrInputDocument inputDoc = 
org.apache.solr.client.solrj.util.ClientUtils.toSolrInputDocument(solrDoc); 
Map<String, String> partialUpdate = new HashMap<String, String>(); 
partialUpdateOut.put("add", "newAddedValue"); 
inputDoc.addField("fieldName", partialUpdate); 
concurrentServer.add(inputDoc); 

을하지만 난 SolrDocument이 버전의 데이터를 가지고 있기 때문에 추측 내부 - 그것은 업데이 트를 엉망.

올바른 방법은 다음과 같이 문서의 ID 만 업데이트하는 것입니다 :

SolrInputDocument inputDoc = new SolrInputDocument(); 
inputDoc.addField("id", solrDoc.getFieldValue("id")); 
Map<String, String> partialUpdate = new HashMap<String, String>(); 
partialUpdateOut.put("add", "newAddedValue"); 
inputDoc.addField("fieldName", partialUpdate); 
concurrentServer.add(inputDoc); 

감사합니다!

관련 문제