将多个单独的查询合并为一个以在Elasticsearch中获取聚合结果

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了将多个单独的查询合并为一个以在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上查找解决方案。但是,没有运气

答案

您可以使用filter aggregationvalue_count聚合来组合这两个查询。在两个查询中,在must子句中的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"
            }
          }
        }
      }
    }
  }
}

以上是关于将多个单独的查询合并为一个以在Elasticsearch中获取聚合结果的主要内容,如果未能解决你的问题,请参考以下文章

将单独的查询结果合并为一个结果

Roslyn:如何将多个项目的编译合并为 1 个单独的编译?

将多个 CASE 语句合并为一个并 SELECT INTO 临时表

Postgres如何将2个单独的选择查询合并为1个

如何将 React 组件导出为 NPM 包以在单独的项目中使用?

跳出查询以在存储过程中从单独的表中获取 where 子句