具有多个条件和时间范围的Elasticsearch查询

时间:2017-08-09 17:19:20

标签: elasticsearch date-range

我正在尝试创建一个查询来计算最后一天满足两个条件的实例。

此查询显示两个条件的计数,但当我尝试添加范围时,它似乎匹配所有文档:

 GET logstash-*/_count
    {
      "query": {
        "bool": {
          "should": [
            {
              "match": {
                "rawmsg": {
                "query": "Could not send Message.",
                "type": "phrase"
              }
              }
            },
            {
              "match": {
                "stack_trace": {
                  "query": "*WebServiceException*",
                  "type": "phrase"
                  }
              }
            }
          ]
        }
      }

}

以下是我尝试添加日期范围的方法:

GET logstash-*/_count
{
  "query": {
    "bool": {
      "should": [
        {
          "match": {
            "rawmsg": {
            "query": "Could not send Message.",
            "type": "phrase"
          }
          }
        },
        {
          "match": {
            "stack_trace": {
              "query": "*WebServiceException*",
              "type": "phrase"
              }
          }
        },
        {

          "range" : {
            "@timestamp" : {
                "gte" : "now-1d/d",
                "lt" :  "now/d"
            }
        }
        }
      ]
    }
  }

}

2 个答案:

答案 0 :(得分:0)

您使用的是should子句而不是must子句,它有效地将您的条件与OR而不是AND结合起来。

此外,范围查询的时间戳应为now/d-1d

答案 1 :(得分:0)

我最终找到了两种方法来完成我需要的东西:

GET logstash-*/tcp_input/_count?q=stack_trace: *WebServiceException* AND rawmsg: "Could not send Message" AND @timestamp: [ now-30d TO now ]

and

GET logstash-*/_count
{
  "query": {
    "query_string": {
      "query": """stack_trace: *WebServiceException* AND rawmsg: "Could not send Message" AND @timestamp: [  now-3d  TO now]""",
      "analyze_wildcard": true
    }
  }
}