ElasticSearch index exists not working / reliable
elasticsearch, java
Solution
OK, I figured out a solution. Since the java client's calls are done asynchronously you have to use the variant which takes an action listener. The solution still gets a bit contrived though:
// 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;
}
Problem
I am writing a simple Java wrapper around ElasticSearch's admin client. To test it I have a main method that first checks if an index exists (IndicesExistsRequest), if so deletes it (DeleteIndexRequest), and creates the index again. See code below. Yet I consistently get an IndexAlreadyExistsException. By the way I am trying to get a client for the node that you start from the command prompt (by simply typing "elastic search"). I have tried every combination of methods on nodeBuilder's fluent interface, but I can't seem to get one. ``` 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 create index " + indexName); } logger.info("Index created"); } ```