将多个单个查询合并为一个,以在Elasticsearch中获得汇总结果

时间:2019-03-05 01:13:04

标签: elasticsearch

我在ElasticSearch中构建了两个查询,以获取每个错误消息的计数。例如,第一个查询是获取与“未找到”错误相关的错误消息

GET /logstash*/_search
{
  "query": {
    "bool": {
      "filter": {
        "bool": {
          "must": [
            {
              "match": {
                "kubernetes.pod_name": "api"
              }
            },
            {
              "match": {
                "log": "error"
              }
            },
            {
              "match": {
                "log": {
                  "query": "was not found",
                  "operator": "and"

                }
              }
            },
            {
              "range": {"@timestamp": {
              "time_zone": "CET",
              "gt": "now-7d",
              "lte": "now"}}
          }
          ]
        }
      }
    }
  },

  "aggs" : {
        "type_count" : {
            "value_count" : {
                "script" : {
                    "source" : "doc['log.keyword'].value"
                }
            }
        }
    }
} 

第二个查询是获取与“重复输入”错误相关的错误消息的计数

GET /logstash*/_search
{
  "query": {
    "bool": {
      "filter": {
        "bool": {
          "must": [
            {
              "match": {
                "kubernetes.pod_name": "api"
              }
            },
            {
              "match": {
                "log": "error"
              }
            },
            {
              "match": {
                "log": {
                  "query": "Duplicate entry",
                  "operator": "and"

                }
              }
            },
            {
              "range": {"@timestamp": {
              "time_zone": "CET",
              "gt": "now-7d",
              "lte": "now"}}
          }
          ]
        }
      }
    }
  },

  "aggs" : {
        "type_count" : {
            "value_count" : {
                "script" : {
                    "source" : "doc['log.keyword'].value"
                }
            }
        }
    }
}

我的老板真的希望我将这些单个查询组合成一个大查询,然后在一个输出中获得每个错误消息的计数列表。由于我们有很多错误消息,这意味着我们必须为每个错误消息编写每个查询,因此我们必须运行每个查询来获取计数。有什么方法可以单击一次运行来获取计数列表?

我一直在尝试使用查询字符串查询,并在Stack Overflow和Documentation上寻找解决方案。但是,没有运气

1 个答案:

答案 0 :(得分:1)

您可以将filter aggregationvalue_count聚合结合使用来组合这两个查询。在这两个查询中,必须子句中的4个查询中只有一个有所不同。您可以将其删除,并将其与以下两个过滤器聚合组合:

{
  "query": {
    "bool": {
      "filter": {
        "bool": {
          "must": [
            {
              "match": {
                "kubernetes.pod_name": "api"
              }
            },
            {
              "match": {
                "log": "error"
              }
            },
            {
              "range": {
                "@timestamp": {
                  "time_zone": "CET",
                  "gt": "now-7d",
                  "lte": "now"
                }
              }
            }
          ]
        }
      }
    }
  },
  "aggs": {
    "not_found_count": {
      "filter": {
        "match": {
          "log": {
            "query": "was not found",
            "operator": "and"
          }
        }
      },
      "aggs": {
        "count": {
          "value_count": {
            "script": {
              "source": "doc['log.keyword'].value"
            }
          }
        }
      }
    },
    "duplicate_entry_count": {
      "filter": {
        "match": {
          "log": {
            "query": "Duplicate entry",
            "operator": "and"
          }
        }
      },
      "aggs": {
        "count": {
          "value_count": {
            "script": {
              "source": "doc['log.keyword'].value"
            }
          }
        }
      }
    }
  }
}