Elastic 中的聚合和筛选条件 - 查找上次命中,然后进行筛选



我正在尝试使用 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
}
}

我试图用这些来做的是,根据name(我的类别)检索最后一个文档(基于@timestamp),查看其状态Info.status是OFFLINE还是UP,并将这些结果提取到响应的命中部分,以便我可以将其放在 Kibana 计数仪表板或其他地方(基于 REST 的工具,我无法控制,也无法自己修改)。 基本上,我想知道我的服务(name)有多少是离线的(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...}
]
}
}
}

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

我认为这在带有PARTITION BY OVER子句ORACLESQL 中是可行的,后跟一个条件。

有人知道如何做到这一点吗?

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

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

POST /index/_search
{
"size": 0,
"query":{
"bool":{
"filter":{
"term": {"statusInfo.status.keyword": "OFFLINE"}
}
}
},
"aggs":{
"services_agg":{
"terms":{
"field": "name.keyword"
},
"aggs":{
"latest_doc":{
"top_hits": {
"sort": [
{
"@timestamp":{
"order": "desc"
}
}
],
"size": 1,
"_source": ["@timestamp", "name", "statusInfo.status"]
}
}
}
}
}
}

相关内容

  • 没有找到相关文章

最新更新