ElasticSearch嵌套AGGS加AND / OR过滤日志

时间:2017-02-02 12:29:02

标签: logging elasticsearch filtering

我正在将一些日志索引到ElasticSearch中,并且我对ES API有一些疑问,以便获取一些信息......

我有一个带有此映射的索引:

IMyInterface

我有一些项目(“projectName”)和一些应用程序(“appName”)'在'里面'。示例:App1和App2属于Project1。 “log”用于'log line',来自应用程序stdout / stderror。

我能够在日志行中获取包含例如“debug”的最新小时日志行...使用aggs并在桶中获取信息。我这样做(卷曲查询到ES api):

"appName" : {
"type" : "string",
    "index" : "not_analyzed"
},  
"log" : {
    "type" : "string"
},  
"projectName" : {
    "type" : "string",
    "index" : "not_analyzed"
}

结果:

{
 "size" : 0,
 "query" :
 { "range" : { "time" : { "from" : "now-1h", "to" : "now" } } },
 "aggs":
 {
  "matcheo"  :
  {
   "filter": 
   {
    "match": { "log" : "debug" }
   },   
   "aggs":
   {
    "projectName":
    {    
     "terms": { "field": "projectName", "size":0 },
     "aggs":
     {
      "appName":
      {
       "terms": { "field": "appName", "size":0 }
      } 
     }
    }
   }
  }
 }
}

每个projectName中的每个appName都是如此...我得到的Project1有两个应用程序:App1包含12个包含“debug”的文档,App2包含48个包含“debug”的文档...

我现在正在努力做的事情是,我无法获得最新的小时日志行,其中包含“调试”或“错误”或“警告”,但这些条款“聚合”。例如,获取每个appName(在每个projectName中)有多少“log:”包含“debug”,多少“log:”包含“error”以及多少“log:”包含“warning”...

我尝试'过滤'匹配:... "matcheo" : { "doc_count" : 25, "projectName" : { "doc_count_error_upper_bound" : 0, "sum_other_doc_count" : 0, "buckets" : [ { "key" : "Project1", "doc_count" : 12, "appName" : { "doc_count_error_upper_bound" : 0, "sum_other_doc_count" : 0, "buckets" : [ { "key" : "App1", "doc_count" : 12 }, { "key" : "App2", "doc_count" : 48 }, } ] ... 但我不知道每个'期限'的数量。

有人能帮我吗?提前致谢!干杯!

1 个答案:

答案 0 :(得分:0)

知道了!使用过滤器聚合!

{
 "size" : 0, 
 "query" :
 { "range" : { "time" : { "from" : "now-1h", "to" : "now" } } },
 "aggs":
 {    
  "projectName":
  {    
   "terms": { "field": "projectName", "size": 0},
   "aggs":
   { 
    "appName":
    {
     "terms": { "field": "appName", "size": 0},
     "aggs":
     {
      "typology" :
      {
       "filters" :
       {
        "other_bucket_key": "other",
        "filters" :
        {
         "errors" :   { "match" : { "log" : "error"   }},
         "warnings" : { "match" : { "log" : "warning" }},
         "debug" : { "match" : { "log" : "debug" }}
        }
       }
      } 
     }
    }
   }
  }
 }
}

所以它有效,现在我能得到这样的东西:

  "aggregations" : {
    "projectName" : {
      "doc_count_error_upper_bound" : 0,
      "sum_other_doc_count" : 0,
      "buckets" : [ {
        "key" : "Project1",
        "doc_count" : 5,
        "appName" : {
          "doc_count_error_upper_bound" : 0,
          "sum_other_doc_count" : 0,
          "buckets" : [ {
            "key" : "App1",
            "doc_count" : 5,
            "tipologia" : {
              "buckets" : {
                "errors" : {
                  "doc_count" : 0
                },
                "warnings" : {
                  "doc_count" : 0
                },
                "debug" : {
                  "doc_count" : 5
                },
                "other" : {
                  "doc_count" : 0
                }
              }
            }
          }, {
          "key" : "App2",
            "doc_count" : 4,
            "tipologia" : {
              "buckets" : {
                "errors" : {
                  "doc_count" : 2
                },
                "warnings" : {
                  "doc_count" : 0
                },
                "debug" : {
                  "doc_count" : 2
                },
                "other" : {
                  "doc_count" : 0
                }
              }
            }
          } ]
        }
      }

我想我用最好的方法来解决这个问题......我呢?

问候。