DataImportHandler сообщает об ошибке, но не завершает - PullRequest
3 голосов
/ 27 января 2012

Я пытаюсь убедить solr выполнить массовый импорт базы данных sqlite.Я настроил DataImportHandler для успешного открытия этой базы данных через jdbc, и я могу начать импорт с помощью wget http://localhost:8080/solr/dataimport?command=full-import, но что бы я ни делал, solr, по-видимому, индексирует только первые 499 документов (как сообщает wget http://localhost:8080/solr/dataimport?command=status).

Файл журнала причала не сообщает об ошибке, вместо этого он сообщает об окончании индексации:

27-Jan-2012 19:08:13 org.apache.solr.handler.dataimport.SolrWriter readIndexerProperties
INFO: Read dataimport.properties
27-Jan-2012 19:08:13 org.apache.solr.handler.dataimport.SolrWriter persist
INFO: Wrote last indexed time to dataimport.properties
27-Jan-2012 19:08:13 org.apache.solr.handler.dataimport.DocBuilder execute
INFO: Time taken = 0:0:1.145

Что я мог сделать неправильно ??

1 Ответ

3 голосов
/ 02 февраля 2012

Я знаю, что не очень хороший вкус отвечать на свой вопрос, но в конце концов я обнаружил неприятную проблему, вызвавшую эту ошибку.

Директива, используемая для настройки solr для конкретного источника данных, выглядит следующим образом:

<dataSource type="JdbcDataSource" driver="org.sqlite.JDBC" url="jdbc:sqlite:/foo.db"/>

По умолчанию класс JdbcDataSource считывает атрибут batchSize этого узла XML и предполагает, что для него установлено значение500, если не указано иное.Итак, вышеприведенное фактически было эквивалентно:

<dataSource type="JdbcDataSource" ... batchSize="500"/>

Теперь JdbcDataSource передает batchSize методу setFetchSize базового драйвера JDBC (в данном случае, драйвера sqlite jdbc).Этот драйвер предполагает, что этот метод фактически запрашивает ограничение количества возвращаемых строк, и поэтому в этом случае никогда не возвращает более 500 строк.Я недостаточно знаком с ожидаемой семантикой API JDBC, чтобы иметь возможность определить, является ли драйвер sqlite неправильным в том, как он интерпретирует это значение, или же это - класс solr JdbcDataSource, который неверен в том, как, по его мнению, драйверы будутреагировать на этот вызов метода.

Однако я знаю, что исправление должно указывать batchSize = "0", потому что драйвер sqlite jdbc предполагает, что нулевое значение означает: "предел строки не указан".Я добавил этот совет на соответствующую страницу часто задаваемых вопросов о solr.

...