2

単体テスト用に 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);
    }

}
4

0 に答える 0