我正在围绕ElasticSearch的管理客户端编写一个简单的Java包装器。为了测试它,我有一个主要方法,该方法首先检查索引是否存在(IndicesExistsRequest),如果存在则将其删除(DeleteIndexRequest),然后再次创建索引。请参见下面的代码。但是我一直得到IndexAlreadyExistsException。
顺便说一句,我正在尝试为您从命令提示符启动的节点获取客户端(只需键入“elasticsearch”)。我已经在nodeBuilder的流畅接口上尝试了每种方法的组合,但是我似乎一无所获。
public static void main(String[] args) { ElasticSearchJavaClient esjc = new ElasticSearchJavaClient("nda"); if (esjc.indexExists()) { esjc.deleteIndex(); } esjc.createIndex(); URL url = SchemaCreator.class.getResource("/elasticsearch/specimen.type.json"); String mappings = FileUtil.getContents(url); esjc.createType("specimen", mappings); } final Client esClient; final IndicesAdminClient adminClient; final String indexName; public ElasticSearchJavaClient(String indexName) { this.indexName = indexName; esClient = nodeBuilder().clusterName("elasticsearch").client(true).node().client(); adminClient = esClient.admin().indices(); } public boolean deleteIndex() { logger.info("Deleting index " + indexName); DeleteIndexRequest request = new DeleteIndexRequest(indexName); try { DeleteIndexResponse response = adminClient.delete(request).actionGet(); if (!response.isAcknowledged()) { throw new Exception("Failed to delete index " + indexName); } logger.info("Index deleted"); return true; } catch (IndexMissingException e) { logger.info("No such index: " + indexName); return false; } } public boolean indexExists() { logger.info(String.format("Verifying existence of index \"%s\"", indexName)); IndicesExistsRequest request = new IndicesExistsRequest(indexName); IndicesExistsResponse response = adminClient.exists(request).actionGet(); if (response.isExists()) { logger.info("Index exists"); return true; } logger.info("No such index"); return false; } public void createIndex() { logger.info("Creating index " + indexName); CreateIndexRequest request = new CreateIndexRequest(indexName); IndicesAdminClient iac = esClient.admin().indices(); CreateIndexResponse response = iac.create(request).actionGet(); if (!response.isAcknowledged()) { throw new Exception("Failed to delete index " + indexName); } logger.info("Index created"); }
好,我想出了一个解决方案。由于Java客户端的调用是异步完成的,因此您必须使用带有操作侦听器的变体。解决方案仍然有些人为的:
// Inner class because it's just used to be thrown out of // the action listener implementation to signal that the // index exists private class ExistsException extends RuntimeException { } public boolean exists() { logger.info(String.format("Verifying existence of index \"%s\"", indexName)); IndicesExistsRequest request = new IndicesExistsRequest(indexName); try { adminClient.exists(request, new ActionListener<IndicesExistsResponse>() { public void onResponse(IndicesExistsResponse response) { if (response.isExists()) { throw new ExistsException(); } } public void onFailure(Throwable e) { ExceptionUtil.smash(e); } }); } catch (ExistsException e) { return true; } return false; }