我正在编写一个通过solr 3.4搜索的应用程序。要填充solr的索引,我使用dataimporthandler和com.microsoft.sqlserver.jdbc.SQLServerDriver类从MS SQL数据库中获取数据。
现在我正在尝试在数据库上调用存储过程,但solr日志总是返回错误:
Full Import failed:org.apache.solr.handler.dataimport.DataImportHandlerException: Unable to execute query: exec dbo.h_getThumbnails @h = '52' Processing Document # 48
at org.apache.solr.handler.dataimport.DataImportHandlerException.wrapAndThrow(DataImportHandlerException.java:72)
at org.apache.solr.handler.dataimport.JdbcDataSource$ResultSetIterator.<init>(JdbcDataSource.java:253)
at org.apache.solr.handler.dataimport.JdbcDataSource.getData(JdbcDataSource.java:210)
at org.apache.solr.handler.dataimport.JdbcDataSource.getData(JdbcDataSource.java:39)
at org.apache.solr.handler.dataimport.SqlEntityProcessor.initQuery(SqlEntityProcessor.java:59)
at org.apache.solr.handler.dataimport.CachedSqlEntityProcessor.getAllNonCachedRows(CachedSqlEntityProcessor.java:69)
at org.apache.solr.handler.dataimport.EntityProcessorBase.getSimpleCacheData(EntityProcessorBase.java:259)
at org.apache.solr.handler.dataimport.CachedSqlEntityProcessor.nextRow(CachedSqlEntityProcessor.java:58)
at org.apache.solr.handler.dataimport.EntityProcessorWrapper.nextRow(EntityProcessorWrapper.java:238)
at org.apache.solr.handler.dataimport.DocBuilder.buildDocument(DocBuilder.java:596)
at org.apache.solr.handler.dataimport.DocBuilder.buildDocument(DocBuilder.java:622)
at org.apache.solr.handler.dataimport.DocBuilder.doFullDump(DocBuilder.java:268)
at org.apache.solr.handler.dataimport.DocBuilder.execute(DocBuilder.java:187)
at org.apache.solr.handler.dataimport.DataImporter.doFullImport(DataImporter.java:359)
at org.apache.solr.handler.dataimport.DataImporter.runCmd(DataImporter.java:427)
at org.apache.solr.handler.dataimport.DataImporter$1.run(DataImporter.java:408)
Caused by: java.lang.NullPointerException
at org.apache.solr.handler.dataimport.JdbcDataSource$ResultSetIterator.<init>(JdbcDataSource.java:251)
... 14 more
我尝试过不同的版本来调用存储过程。这里是查询:
<entity name="PicturePath" processor="CachedSqlEntityProcessor" query="exec dbo.h_getThumbnails @h = 4
"> </entity>
<entity name="PicturePath" processor="CachedSqlEntityProcessor" query="call dbo.h_getThumbnails @h = 4
"> </entity>
<entity name="PicturePath" processor="CachedSqlEntityProcessor" query=" dbo.h_getThumbnails @h = 4
"> </entity>
有没有人知道如何从solr调用存储过程?或者有人知道我应该在哪里寻找原因吗?
非常感谢您的所有答案!
答案 0 :(得分:15)
对我而言,它的工作原理如下:
<dataSource name="ds-1" type="JdbcDataSource" driver="com.microsoft.sqlserver.jdbc.SQLServerDriver" url="jdbc:sqlserver://10.0.2.47;databaseName=dbname" user="username" password="password"
responseBuffering="adaptive" batchSize="0" autoCommit="false" />
<entity name="item" dataSource="ds-1" query="[sp_StuffDataImportHandler]"></entity>
但这仅在存储过程包含简单的SELECT查询时才有效。
如果我在返回结果的查询之前声明了一些变量或临时表,那么导入失败,给我一个相同的异常。
稍后编辑
我设法让它在存储过程中使用更复杂的查询。通过增加 {(1}}在存储过程的开头。
答案 1 :(得分:1)
您需要使用以下语法
调用存储过程<entity name="PicturePath" processor="CachedSqlEntityProcessor" query="[h_getThumbnails] '4'"
"> </entity>