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