我试图从我们的生产服务器中读取包含实际数据的7-8个xml数据文件。然后我想将这些数据读入EmbeddedSolrServer以测试我们的自定义日期搜索的边缘情况。 EmbeddedSolrServer的使用纯粹是为了将数据测试与可能随时间变化的任何环境分开。
我还想避免编写管道代码来从xml导入每个字段,因为我已经有了工作DIH。
使用EmbeddedSolrServer设置集成测试我收到错误:
ERROR o.a.s.h.dataimport.DataImporter - 完全导入失败:java.lang.RuntimeException:org.apache.solr.common.SolrException:SolrCoreState已关闭
设置集成测试的代码是:
public class SolrEmbeddedSearchTest extends AbstractSolrTestCase {
static {
System.setProperty("solr.allow.unsafe.resourceloading", "true");
ClassLoader loader = SolrEmbeddedSearchTest.class.getClassLoader();
loader.setPackageAssertionStatus("org.apache.solr", true);
loader.setPackageAssertionStatus("org.apache.lucene", true);
}
private SolrClient server;
private final String SolrProjectPath = "\\src\\test\\resources\\solr-5.2.1\\server\\solr\\nmdc";
private final String userDir = System.getProperty("user.dir") + SolrProjectPath;
@Override
public String getSolrHome() {
return userDir;
}
@Before
@Override
public void setUp() throws Exception {
super.setUp();
initCore("solrconfig.xml", "schema.xml", userDir, "collection1");
server = new EmbeddedSolrServer(h.getCoreContainer(), h.getCore().getName());
SolrQuery qry = new SolrQuery();
qry.setRequestHandler("/dataimport2");
qry.setParam("command", "full-import");
qry.setParam("clean", false);
server.query(qry);
}
@Test
public void testThatResultsAreReturned() throws Exception {
SolrParams params = new SolrQuery("Entry_ID:imr_1423");
QueryResponse response = server.query(params);
assertEquals(1L, response.getResults().getNumFound());
assertEquals("1", response.getResults().get(0).get("Entry_ID"));
}
}
public class SolrEmbeddedSearchTest extends AbstractSolrTestCase {
static {
System.setProperty("solr.allow.unsafe.resourceloading", "true");
ClassLoader loader = SolrEmbeddedSearchTest.class.getClassLoader();
loader.setPackageAssertionStatus("org.apache.solr", true);
loader.setPackageAssertionStatus("org.apache.lucene", true);
}
private SolrClient server;
private final String SolrProjectPath = "\\src\\test\\resources\\solr-5.2.1\\server\\solr\\nmdc";
private final String userDir = System.getProperty("user.dir") + SolrProjectPath;
@Override
public String getSolrHome() {
return userDir;
}
@Before
@Override
public void setUp() throws Exception {
super.setUp();
initCore("solrconfig.xml", "schema.xml", userDir, "collection1");
server = new EmbeddedSolrServer(h.getCoreContainer(), h.getCore().getName());
SolrQuery qry = new SolrQuery();
qry.setRequestHandler("/dataimport2");
qry.setParam("command", "full-import");
qry.setParam("clean", false);
server.query(qry);
}
@Test
public void testThatResultsAreReturned() throws Exception {
SolrParams params = new SolrQuery("Entry_ID:imr_1423");
QueryResponse response = server.query(params);
assertEquals(1L, response.getResults().getNumFound());
assertEquals("1", response.getResults().get(0).get("Entry_ID"));
}
}
当运行导致此堆栈跟踪时:
以下是完整的堆栈跟踪:https://gist.github.com/emoen/f6c2f80b7ba09a59fa6b - 异常从第683行开始。
Schema.xml,solrconfig.xml和dih-config.xml已从可运行的独立Solr 5.2.1实例中复制。
为什么SolrCoreState在安装完成之前关闭,并且使用handler处理器导入数据:/ dataimport2?
使用EmbeddedSolr进行dataimport的最佳方法是什么?我尝试了这里建议的方法:Embedded Solr DIH但是在发送http请求之前,solr已关闭。
调试代码 - 它看起来像这条线
DEBUG o.a.s.u.processor.LogUpdateProcessor - PRE_UPDATE add{,id=imr_1423} {qt=/dataimport2&expandMacros=false&config=dih-config.xml&command=full-import}
15:40:38.713 [Thread-2] WARN o.a.s.handler.dataimport.SolrWriter - Error creating document : SolrInputDocument(fields: [Entry_Title=...])
org.apache.solr.common.SolrException: SolrCoreState already closed
初始化核心两次。
在solrconfig.xml中,我使用
initCore("solrconfig.xml", "schema.xml", userDir, "collection1");
当读取solrconfig.xml时,日志会选择它:
<dataDir>F:\prosjekt3\nmdc\source\central-api\src\test\resources\solr-5.2.1\server\solr\configsets\nmdc\data</dataDir>
但是在日志中,它正在使用另一个dataDir:
DEBUG org.apache.solr.core.Config - solrconfig.xml dataDir=F:\prosjekt3\nmdc\source\central-api\src\test\resources\solr-5.2.1\server\solr\nmdc\collection1\data
它开始加载jar文件,第二次读取solrconfig.xml和schema.xml。