3

我试图说服 solr 执行 sqlite 数据库的批量导入。我将 DataImportHandler 配置为通过 jdbc 成功打开该数据库,我可以使用 wget http://localhost:8080/solr/dataimport?command=full-import开始导入,但无论我做什么,solr 似乎只索引前 499文件(由 wget http://localhost:8080/solr/dataimport?command=status报告)。

jetty 日志文件不报告任何错误消息。相反,它报告索引结束:

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

我做错了什么?

4

1 回答 1

3

我知道回答自己的问题不是很好的品味,但我最终找出了导致此错误的讨厌问题。

用于为特定数据源配置 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 驱动程序(在本例中为 sqlite jdbc 驱动程序)的方法 setFetchSize。此驱动程序假定此方法实际上要求它限制返回的行数,因此在这种情况下永远不会返回超过 500 行。我对 JDBC API 的预期语义不够熟悉,无法判断是 sqlite 驱动程序在解释这个值的方式上是错误的,还是 solr JdbcDataSource 类在它认为驱动程序的方式上是错误的对此方法调用做出反应。

不过,我所知道的是,解决方法是指定 batchSize="0",因为 sqlite jdbc 驱动程序假定值为零意味着:“未指定行限制”。我将此提示添加到相应的 solr FAQ 页面。

于 2012-02-02T14:08:12.613 回答