Обновления SOLR потеряны с помощью concurrentUpdateSollrServer и атомарных обновлений.

У меня есть один сервер SOLR (не облако) с автоматической фиксацией каждые 15 секунд. Проиндексировав в него множество документов, теперь я хочу внести изменения в некоторые поля. Поскольку это изменение очень большое, мне нужно сделать это с помощью ~ 40 потоков.

Я использую один concurrentUpdateSorrServer для всех потоков. Я настроил этот сервер на очистку каждой 1000 документов и использовал 48 внутренних потоков. (темы не мои).

Поскольку я хочу добавить значения в многозначное поле, я использовал атомарное добавление.

Я останавливаю процесс после обновления ~ 5000 документов. Я вызываю commit + blockUntilFinshed + shutdown перед выходом.

Когда я запрашиваю сервер SOLR, кажется, что только около 200 документов получают обновление.

Я пробовал это также только с 1 потоком (мой поток - все еще 48 на сервере обновлений) и все та же проблема.

Когда я перехожу с concurrentUpdateSollrServer на HttpSolrServer (1 поток), все работает нормально.


person Tom    schedule 27.11.2013    source источник
comment
Сколько коммитов/добавлений вы видите в логах?   -  person MatsLindh    schedule 27.11.2013


Ответы (1)


ОК решил это:

Ошибка заключалась в том, что у меня был 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 были данные о версии, это испортило обновление.

Правильный способ - обновить только по идентификатору документа следующим образом:

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

Спасибо!

person Tom    schedule 28.11.2013