DataImportHandler报告没有错误,但没有完成

问题描述:

我想说服solr执行sqlite数据库的批量导入。我将DataImportHandler配置为通过jdbc成功打开该数据库,并且可以使用wget http://localhost:8080/solr/dataimport?command=full-import开始导入,但无论我如何操作,solr似乎只是索引前499个文档(由wget http://localhost:8080/solr/dataimport?command=status报告)。DataImportHandler报告没有错误,但没有完成

码头日志文件不会报告任何错误消息。相反,它报告索引的末尾:

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 

什么可能我做错了?

+0

你可以发布你的data-config.xml文件吗? – Evan 2012-01-27 22:32:03

+0

这可能是data-config.xml文件或schema.xml文件的问题 – 2012-01-30 13:49:55

我知道回答自己的问题并不是很好的品味,但我最终发现了导致这个错误的讨厌问题。

用于配置一个特定的数据源的solr该指令是这样的:

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

默认情况下,JdbcDataSource类读取该XML节点的BATCHSIZE属性并假定除非指定其被设置为500。所以,上面的实际上等同于:

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

现在,JdbcDataSource传递BATCHSIZE到底层JDBC驱动器的方法的setFetchSize(在这种情况下,SQLite的JDBC驱动程序)。此驱动程序假定此方法实际上要求它限制返回的行数,因此在此情况下从不返回多于500行。我不太熟悉JDBC API的预期语义,以便能够判断它是否是sqlite驱动程序在解释此值时是错误的,还是它是否认为驱动程序将如何错误地解析JdbcDataSource类对此方法调用作出反应。

但我知道的是,修正是指定batchSize =“0”,因为sqlite jdbc驱动程序假定值为零意味着:“没有指定行限制”。我将此提示添加到相应的solr FAQ页面。