Solr 4.2 EmbeddedSolrServer无法加载现有索引数据

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 但

我正在扩展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官方示例的索引数据

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没有加载现有索引)。