Elasticsearch 查询中的进一步聚合日期直方图

Further aggregate date histogram in Elasticsearch query

提问人:dcolazin 提问时间:11/17/2023 更新时间:11/17/2023 访问量:21

问:

我正在尝试提取每个事件发生的天数和最后一次发生的天数。目前我写了以下查询:event_type

{
    "size": 0,
    "query": { ... },
    "_source": false,
    "aggregations": {
        "events": { 
            "terms": { "field": "event_type" },
            "aggs": {
                "event_timestamp": {
                    "date_histogram": {
                        "field": "@timestamp",
                        "calendar_interval": "day",
                        "min_doc_count": 1,
                        "order": { "_key": "desc" }
                    }
                }
            }
        }
    }
}

提取要进一步转换的数据。就我而言,我只需要每个 ,第一个存储桶的键和存储桶的数量。这可以在提取后的第二步中轻松完成,但让 Elastic 来做会更干净。event_typeevent_timestampevent_timestamp

最大存储桶(或指标)聚合似乎没有帮助,因为我在聚合中看不到合适的。buckets_pathdate_histogram

弹性搜索

评论


答:

1赞 Val 11/17/2023 #1

良好的开端!!

下面是一个查询,它返回每个时间戳的最新时间戳以及每个存储桶的每日存储桶数(为此,您可以使用bucket_script管道聚合,它只返回聚合中的存储桶数)。event_typeevent_typedate_histogram

另请注意,查询字符串参数允许您只返回对您重要的内容,即您可以删除您不感兴趣的日期直方图:filter_path

POST test/_search?filter_path=**.latest_timestamp.hits.hits._source,**.bucket_count,**.events.buckets.key
{
  "size": 0,
  "_source": false,
  "query": {...},
  "aggregations": {
    "events": {
      "terms": {
        "field": "event_type"
      },
      "aggs": {
        "latest_timestamp": {
          "top_hits": {
            "size": 1,
            "sort": {"@timestamp": "desc"}, 
            "_source": ["@timestamp"]
          }
        },
        "event_timestamp": {
          "date_histogram": {
            "field": "@timestamp",
            "calendar_interval": "day",
            "min_doc_count": 1,
            "order": {
              "_key": "desc"
            }
          }
        },
        "bucket_count": {
          "bucket_script": {
            "buckets_path": {
              "count": "event_timestamp._bucket_count"
            },
            "script": "params.count"
          }
        }
      }
    }
  }
}

对于每个事件类型,你将获得如下所示的内容:

    {
      "key": "2",                            <--- event type
      "latest": {
        "hits": {
          "hits": [
            {
              "_source": {
                "@timestamp": "2023-01-05"   <--- latest timestamp
              }
            }
          ]
        }
      },
      "bucket_count": {
        "value": 4                           <--- bucket count
      }
    },

评论

0赞 dcolazin 11/17/2023
谢谢!注意:我在桶计数中需要的是“count”:“event_timestamp._bucket_count”
0赞 Val 11/17/2023
是的,这就是_count已经返回的,请参阅我更新的答案
0赞 dcolazin 11/17/2023
不,我看到了一些区别:_count返回文档计数而不是存储桶计数
1赞 Val 11/17/2023
我的错,你是对的,它已修复👍,我每天使用一个独特的文档进行测试,因此感到困惑,对不起