Elastic中的聚合和过滤器 - 找到最后的命中并在之后过滤它们

时间:2018-04-05 22:10:45

标签: elasticsearch aggregation buckets

我尝试使用Elastic(5.6)并找到一种方法来检索每个类别的顶级文档。

我有一个包含以下类型文档的索引:

{
      "@timestamp": "2018-03-22T00:31:00.004+01:00",
      "statusInfo": {
        "status": "OFFLINE",
        "timestamp": 1521675034892
      },
      "name": "myServiceName",
      "id": "xxxx",
      "type": "Http",
      "key": "key1",
      "httpStatusCode": 200
    }
  }

我尝试使用这些内容,是根据@timestamp(我的类别)检索最后一个文档(name - ),看看它的statusInfo.status是否为{{1 }或OFFLINE并将这些结果提取到响应的命中部分,这样我就可以把它放在Kibana计数仪表板或其他地方(我无法控制的基于REST的工具,我自己无法修改) )。 基本上,我想知道我的服务(UP)在上次更新(name)中有多少是OFFLINE(statusInfo.status)用于监控目的。 我被困在"获取了多少我的服务"一部分。

到目前为止我的查询:

@timestamp

这提供了以下回复:

GET actuator/_search
{
  "size": 0,
  "aggs": {
    "name_agg": {
      "terms": {
        "field": "name.raw",
        "size": 1000
      },
      "aggs": {
        "last_document": {
          "top_hits": {
            "_source": ["@timestamp", "name", "statusInfo.status"], 
            "size": 1,
            "sort": [
              {
                "@timestamp": {
                  "order": "desc"
                }
              }
            ]
          }
        }
      }
    }
  },
  "post_filter": {
    "bool": {
      "must_not": {
        "term": {
          "statusInfo.status.raw": "UP"
        }
      }
    }
  }
}

删除大小使得结果包含所有文档,这不是我需要的,我只需要每个桶内容(每个包含一个桶)。 删除后置过滤器似乎没有太大作用。

我认为这在带有{ "all_the_meta":{...}, "hits": { "total": 1234, "max_score": 0, "hits": [] }, "aggregations": { "name_agg": { "doc_count_error_upper_bound": 0, "sum_other_doc_count": 0, "buckets": [ { "key": "myCategory1", "doc_count": 225, "last_document": { "hits": { "total": 225, "max_score": null, "hits": [ { "_index": "myIndex", "_type": "Http", "_id": "dummy id", "_score": null, "_source": { "@timestamp": "2018-04-06T00:06:00.005+02:00", "statusInfo": { "status": "UP" }, "name": "myCategory1" }, "sort": [ 1522965960005 ] } ] } } }, {other_buckets...} ] } } } 子句的ORACLE SQL中是可行的,后跟条件。

有人知道如何实现这一目标吗?

1 个答案:

答案 0 :(得分:0)

如果我理解正确,您正在寻找每个组中具有OFFLINE状态的最新文档(按名称分组)?在这种情况下,您可以尝试下面的查询,并且存储桶中的项目数量应该为您提供“已关闭的数量”(对于您将更改过滤器中的术语)

注意:这是在最新版本中完成的,因此它使用关键字字段而不是原始

enum STATUS {
    OK = 0,
    BAD = 1,
};

STATUS func1(char *pData)
{
    pData = "Hello World";

    cout << pData << endl;

    return OK;
}

int main()
{
    STATUS ret;
    char arr[] = "Example String";
    char* pArray = &arr[0];

    ret = func1(pArray);

    cout << arr << endl;
    cout << pArray << endl;


    getchar();

    return 0;
}