ElasticSearch索引不起作用/可靠

我正在围绕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;

}

以上是 ElasticSearch索引不起作用/可靠 的全部内容, 来源链接: utcz.com/qa/416711.html

回到顶部