zl程序教程

您现在的位置是:首页 >  数据库

当前栏目

详述 Elasticsearch 通过 RESTful API 查询索引信息的方法

2023-04-18 14:11:30 时间

文章目录

情景

在使用 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("
", ""));          
        }
	} 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 为节点间通讯端口。

最后,本文的内容简单易懂,希望能够为有此类疑问的同学提供一点解决思路,如果能再帮助三两个同学解决问题就更好了。