文章目录- 情景
- 解决方案
情景
在使用 Elasticsearch 的时候,我们通常有两种方法来操作集群,
- 第一种:在服务器或者终端,使用命令来操作集群;
- 第二种:编写程序,通过 Elasticsearch 的 API 来操作集群。
其中,
- 第一种方式是功能最全的,Elasticsearch 的所有操作情形,都可以通过命令来实现;
- 第二种方式则略有局限,因为 Elasticsearch 的对外 API 仅提供了部分的操作接口。
因此,我们就有可以遇到这样一个问题,那就是:
- 我们想通过编程实现某些操作集群的目的,但却没有对应的 API 可供使用,如何解决?
以 Java 语言为例,Elasticsearch 提供的接口文档为:Java API,可能我们翻遍整个 API 文档也找不到对应_cat/indices
命令的接口。
解决方案
虽然 Elasticsearch 没有为我们提供对应所有命令的 Java API 接口,但其却为我们提供了所有 RESTful API 形式的接口。因此,解决方法也很简单,只要我们自己编程代码,通过 Elasticsearch 的 RESTful API 接口获取相应的结果即可!同样,以上述的_cat/indices
命令为例,我们来获取其对应的查询结果:
public Map<String, Object> getIndexInfoByIndexName(String indexName) {
Map<String, Object> indexInfoMap = new HashMap<>();
// 拼接URL,任意主节点 IP 9200 端口
String indexInfoUrl = "http://masterNodeIp:9200/_cat/indices/";
RestTemplate restTemplate = new RestTemplate();
try {
String restfulResult = restTemplate.getForObject(indexInfoUrl indexName, String.class);
if (restfulResult != null) {
String[] restfulResultArray = restfulResult.split(" ");
indexInfoMap.put("health", restfulResultArray[0]);
indexInfoMap.put("status", restfulResultArray[1]);
indexInfoMap.put("index", restfulResultArray[2]);
indexInfoMap.put("uuid", restfulResultArray[3]);
indexInfoMap.put("pri", restfulResultArray[4]);
indexInfoMap.put("rep", restfulResultArray[5]);
indexInfoMap.put("docs.count", restfulResultArray[6]);
indexInfoMap.put("docs.deleted", restfulResultArray[7]);
indexInfoMap.put("store.size", restfulResultArray[8]);
indexInfoMap.put("pri.store.size", restfulResultArray[9].replace("n", ""));
}
} catch (Throwable e) {
logger.error("call { " indexInfoUrl indexName " } come cross a error, message is " e);
}
return indexInfoMap;
}
如上述所示,为简单的调用 RESTful API 接口的代码示例。
在这里,有两点需要我们特别注意的事情,分别为:
- 接口IP,为 Elasticsearch 集群中任意主节点的 IP 即可;
- 端口号,对外暴露的 RESTful API 端口为 9200,而 9300 为节点间通讯端口。
最后,本文的内容简单易懂,希望能够为有此类疑问的同学提供一点解决思路,如果能再帮助三两个同学解决问题就更好了。