Solr 4.2 EmbeddedSolrServer无法加载现有索引数据
我正在扩展Solr的AbstractSolrTestCase用于单元测试 我有现有的“schema.xml”、“solrconfig.xml”和索引数据。我可以启动嵌入式solr服务器来加载现有集合及其数据。然后在solr中测试搜索文档 这些测试文件(solr conf和数据索引)仍然可以使用solr 4.2。我可以在命令行中启动solr服务器,并通过管理页面成功地查询文档 java-Dsolr.solr.home=/somewhere/testdata/solr-jar start.jar 但是,在适应Solr 4.2.1之后,这种方法不再有效。经过一些调查,我发现solr的EmbeddedSolrServer似乎没有加载索引数据 有人知道如何让EmbeddedSolrServer加载现有的索引数据吗 我使用下面的代码创建用于单元测试的嵌入式服务器。在下面的代码中,我使用来自solr官方示例的索引数据Solr 4.2 EmbeddedSolrServer无法加载现有索引数据,solr,lucene,solr4,Solr,Lucene,Solr4,我正在扩展Solr的AbstractSolrTestCase用于单元测试 我有现有的“schema.xml”、“solrconfig.xml”和索引数据。我可以启动嵌入式solr服务器来加载现有集合及其数据。然后在solr中测试搜索文档 这些测试文件(solr conf和数据索引)仍然可以使用solr 4.2。我可以在命令行中启动solr服务器,并通过管理页面成功地查询文档 java-Dsolr.solr.home=/somewhere/testdata/solr-jar start.jar 但
public class IntegrationSolrTest2 extends AbstractSolrTestCase {
private static final String CORE_NAME = "collection1";
private static File solrTestHome = new File(
"/Users/kane/Downloads/solr-4.2.1/example/solr");
private static File confHome = new File(solrTestHome, CORE_NAME + "/conf");
private static File indexFile = new File(confHome.getParentFile(),
"data/index");
private SolrServer server;
@Override
public String getSolrHome() {
return solrTestHome.getAbsolutePath();
}
final String configFile = new File(confHome, "solrconfig.xml")
.getAbsolutePath();
// Creates a container based on infos needed to create one core
static class Initializer extends CoreContainer.Initializer {
String coreName;
String dataDirectory;
SolrConfig solrConfig;
IndexSchema indexSchema;
public Initializer(String coreName, String dataDirectory,
SolrConfig solrConfig, IndexSchema indexSchema) {
if (coreName == null)
coreName = CoreContainer.DEFAULT_DEFAULT_CORE_NAME;
this.coreName = coreName;
this.dataDirectory = dataDirectory;
this.solrConfig = solrConfig;
this.indexSchema = indexSchema;
}
public String getCoreName() {
return coreName;
}
@Override
public CoreContainer initialize() {
CoreContainer container = new CoreContainer(new SolrResourceLoader(
SolrResourceLoader.locateSolrHome())) {
{
hostPort = System.getProperty("hostPort");
hostContext = "solr";
defaultCoreName = coreName;
initShardHandler(null);
initZooKeeper(System.getProperty("zkHost"), 10000);
}
};
LogWatcher<?> logging = new JulWatcher("test");
logging.registerListener(new ListenerConfig(), container);
container.setLogging(logging);
CoreDescriptor dcore = new CoreDescriptor(container, coreName,
solrConfig.getResourceLoader().getInstanceDir());
dcore.setConfigName(solrConfig.getResourceName());
dcore.setSchemaName(indexSchema.getResourceName());
SolrCore core = new SolrCore(coreName, dataDirectory, solrConfig,
indexSchema, dcore);
container.register(coreName, core, false);
// TODO: we should be exercising the *same* core container
// initialization code, not equivalent code!
if (container.getZkController() == null
&& core.getUpdateHandler().getUpdateLog() != null) {
// always kick off recovery if we are in standalone mode.
core.getUpdateHandler().getUpdateLog().recoverFromLog();
}
return container;
}
}
@Before
public void prepare() throws Exception {
super.setUp();
solrConfig = TestHarness.createConfig(solrTestHome.getAbsolutePath(),
CORE_NAME, configFile);
h = new TestHarness(IntegrationSolrTest2.CORE_NAME, new Initializer(
IntegrationSolrTest2.CORE_NAME, indexFile.getParentFile()
.getAbsolutePath(), solrConfig, new IndexSchema(
solrConfig, getSchemaFile(), null)));
server = new EmbeddedSolrServer(h.getCoreContainer(), h.getCore()
.getName());
h.getCoreContainer().reload(CORE_NAME);
}
@After
public void cleanup() {
h.getCoreContainer().shutdown();
}
@Test
public void searchAll() throws Exception {
h.reload();
SolrQuery params = new SolrQuery();
params.setQuery("*:*");
QueryResponse response = server.query(params);
final SolrDocumentList results = response.getResults();
assertTrue("Not search the expected goods!", results.getNumFound() > 0);
}
}
公共类集成SolrTest2扩展了AbstractSolrTestCase{
私有静态最终字符串CORE_NAME=“collection1”;
私有静态文件solrTestHome=新文件(
“/Users/kane/Downloads/solr-4.2.1/example/solr”);
私有静态文件confHome=新文件(solrTestHome,CORE_NAME+“/conf”);
私有静态文件indexFile=新文件(confHome.getParentFile(),
“数据/索引”);
专用SolrServer服务器;
@凌驾
公共字符串getSolrHome(){
返回solrTestHome.getAbsolutePath();
}
最后一个字符串configFile=新文件(confHome,“solrconfig.xml”)
.getAbsolutePath();
//根据创建一个核心所需的信息创建容器
静态类初始值设定项扩展CoreContainer.Initializer{
字符串coreName;
字符串数据目录;
SolrConfig SolrConfig;
IndexSchema IndexSchema;
公共初始值设定项(字符串coreName、字符串dataDirectory、,
SolrConfig SolrConfig,IndexSchema IndexSchema){
if(coreName==null)
coreName=CoreContainer.DEFAULT\u DEFAULT\u CORE\u NAME;
this.coreName=coreName;
this.dataDirectory=dataDirectory;
this.solrConfig=solrConfig;
this.indexSchema=indexSchema;
}
公共字符串getCoreName(){
返回coreName;
}
@凌驾
公共核心容器初始化(){
CoreContainer容器=新CoreContainer(新SolrResourceLoader(
SolrResourceLoader.locateSolrHome()){
{
hostPort=System.getProperty(“hostPort”);
hostContext=“solr”;
defaultCoreName=coreName;
initShardHandler(null);
initZooKeeper(System.getProperty(“zkHost”),10000;
}
};
LogWatcher logging=新的观察者(“测试”);
registerListener(新ListenerConfig(),容器);
container.setLogging(日志记录);
CoreDescriptor dcore=新的CoreDescriptor(容器、coreName、,
solrConfig.getResourceLoader().getInstanceDir());
dcore.setConfigName(solrConfig.getResourceName());
dcore.setSchemaName(indexSchema.getResourceName());
SolrCore=新的SolrCore(coreName、dataDirectory、solrConfig、,
indexSchema,dcore);
容器。注册表(coreName、core、false);
//TODO:我们应该使用相同的核心容器
//初始化代码,不是等效代码!
if(container.getZkController()==null
&&core.getUpdateHandler().getUpdateLog()!=null){
//如果我们处于独立模式,请始终启动恢复。
core.getUpdateHandler().getUpdateLog().recoverFromLog();
}
返回容器;
}
}
@以前
public void prepare()引发异常{
super.setUp();
solrConfig=TestHarness.createConfig(solrTestHome.getAbsolutePath(),
核心(名称、配置文件);
h=新测试线束(IntegrationSolrTest2.CORE\u名称,新初始值设定项(
IntegrationSolrTest2.CORE\u名称,indexFile.getParentFile()
.getAbsolutePath(),solrConfig,新索引模式(
solrConfig,getSchemaFile(),null));
服务器=新的EmbeddedSolrServer(h.getCoreContainer(),h.getCore())
.getName());
h、 getCoreContainer().reload(核心名称);
}
@之后
公共空间清理(){
h、 getCoreContainer().shutdown();
}
@试验
public void searchAll()引发异常{
h、 重新加载();
SolrQuery参数=新的SolrQuery();
参数setQuery(“*:*”);
QueryResponse response=server.query(参数);
最终SolrDocumentList结果=response.getResults();
assertTrue(“不搜索预期商品!”,results.getNumFound()>0);
}
}
你检查了吗?@kamaci,我确实把我的索引文件放在了“/data/index”下面。我还尝试使用上面的测试代码加载Solr4.2.1官方示例创建的索引,但它也不起作用。但是,当使用solr 3.6时,我可以使用EmbeddedSolrServer加载现有索引。您会说:“然而,在适应solr 4.2.1之后,这种方式不再有效”您是否收到任何错误?@kamaci,启动EmbeddedSolrServer时没有错误。但我无法从中查询任何文档。您可以看到,我有一个非常简单的测试用例searchAll来查询Solr中的所有文档,但在将Solr迁移到4.2.1之后,Solr core中似乎没有文档(我怀疑Solr没有加载现有索引)。