用于查询主机名的 Elasticsearch 脚本

Elasticsearch script to query hostnames

我想创建一个脚本,该脚本将查询多个主机名,如果它不在索引中则提供未找到的结果,如果找到则提供服务器上的主机和文档数。到目前为止我所拥有的似乎有效,但我不确定如何让它查询多个服务器并提供正确的结果。任何帮助将不胜感激。

GET /index1*/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "range": {
            "@timestamp": {
              "gte": "now-7d",
              "lt": "now"
            }
          }
        },
        {
          "term": {
            "host.name": "server1"
          }
        }
      ]
    }
  },
  "aggregations": {
    "hosts": {
      "composite": {
        "size": 1000,
        "sources": [
          {
            "hostname": {
              "terms": {
                "field": "host.name"
              }
            }
          }
        ]
      }
    }
  },
  "size": 0

到目前为止开端不错!您可以简单地将 term 查询更改为 terms 查询。此外,您需要利用 missing bucket 功能来获取未找到的结果:

GET /index1*/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "range": {
            "@timestamp": {
              "gte": "now-7d",
              "lt": "now"
            }
          }
        },
        {
          "terms": {
            "host.name": ["server1", "server2", "server3"]
          }
        }
      ]
    }
  },
  "aggregations": {
    "hosts": {
      "composite": {
        "size": 1000,
        "sources": [
          {
            "hostname": {
              "terms": {
                "field": "host.name",
                "missing_bucket": true,
                "missing_order": "last"
              }
            }
          }
        ]
      }
    }
  },
  "size": 0
}

所有在给定时间间隔内有文档的服务器都会有桶,所有其他服务器都在“空”桶中。