使用聚合查找最新批次中的文件数

Posted

技术标签:

【中文标题】使用聚合查找最新批次中的文件数【英文标题】:Finding number of files in latest batch using aggregations 【发布时间】:2021-12-03 19:34:16 【问题描述】:

我在 Elasticsearch 论坛上问过这个same question,但还没有得到答案。

这是场景:

我有一个索引,其中包含表示上传到文件存储的文件的文档。这些文档是分批上传的,每个文档都标记有一个 batch_id 字段以及它们的上传时间。它们还有一个状态字段,用于跟踪文件在摄取期间是否通过/失败。

一些示例文档:


    "batch_id" : "a",
    "file_name" : "file_1_from_batch_a",
    "@timestamp" : "2021-10-12T18:12:54.331Z",
    "status" : "success"
 

    "batch_id" : "a",
    "file_name" : "file_2_from_batch_a",
    "@timestamp" : "2021-10-12T00:00:00.000Z",
    "status" : "success"


    "batch_id" : "b",
    "file_name" : "file_1_from_batch_b",
    "@timestamp" : "2021-10-13T18:13:00.000Z",
    "status" : "failure"


    "batch_id" : "b",
    "file_name" : "file_2_from_batch_b",
    "@timestamp" : "2021-10-13T18:10:22.450Z",
    "status" : "failure"

我希望对索引执行聚合查询,以了解最新一批文件中发生了多少失败。

到目前为止,这是我想出的,但遗憾的是它没有给出正确的答案

GET my-index/_search

  "size": 0,
  "aggs": 
    "most_recent" : 
      "terms": 
        "field" : "@timestamp",
        "order":  "_term": "desc" ,
        "size": 1
      ,
      "aggs": 
        "execution_id": 
          "terms": 
            "field": "batch_id.keyword"
          ,
          "aggs": 
            "failures": 
              "filter": "term": "status.keyword": "failure"
            
          
        
      
    
  

回复:


  "took" : 1,
  "timed_out" : false,
  "_shards" : 
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  ,
  "hits" : 
    "total" : 
      "value" : 4,
      "relation" : "eq"
    ,
    "max_score" : null,
    "hits" : [ ]
  ,
  "aggregations" : 
    "most_recent" : 
      "doc_count_error_upper_bound" : 0,
      "sum_other_doc_count" : 3,
      "buckets" : [
        
          "key" : 1634148780000,
          "key_as_string" : "2021-10-13T18:13:00.000Z",
          "doc_count" : 1,
          "execution_id" : 
            "doc_count_error_upper_bound" : 0,
            "sum_other_doc_count" : 0,
            "buckets" : [
              
                "key" : "b",
                "doc_count" : 1,
                "failures" : 
                  "doc_count" : 1
                
              
            ]
          
        
      ]
    
  

查询为我提供了最新批次的 batch_id(这很好),但错误地告诉我该批次中有多少文件失败(应该是 2)。

我将不胜感激!

【问题讨论】:

【参考方案1】:

您正在聚合时间戳,除非 2 个批次具有完全相同的时间戳,否则始终会产生 doc_count1

由于它是在唯一时间戳上聚合批次,因此您实际上并没有根据 batch_id 将它们分组为批次。first

为了证明这一点,将您的 terms 查询更改为不包含 size 参数,您将看到搜索结果将包括 2 个 as 和 2 个 bs 按时间戳“分组” .

"terms": 
  "field" : "@timestamp",
  "order":  "_term": "desc" 


这就是它的原因,但我目前无法测试什么是工作版本,所以把它留在这里作为草稿。

【讨论】:

以上是关于使用聚合查找最新批次中的文件数的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Python 计算目录中的文件数

在所有子目录中查找具有特定扩展名的文件数

C++ 查找指定目录下的文件数

C++ 查找指定目录下的文件数

如何计算每个目录中的文件数?

计算Linux目录中的文件数? [关闭]