Elasticsearch:从查询匹配中统计文档

时间:2018-10-15 04:52:36

标签: elasticsearch kibana elastic-stack elasticsearch-aggregation

我想获取在某个时间范围内与特定字符串匹配的文档数。

如何从该查询中指定时间范围?

GET myindex/_count
{
  "query": {
            "match" : {
            "log" : "ERROR"
        }
  }
}

要获取时间范围:

{
  "query": {
    "range": {
      "msgSubmissionTime": {
        "gte": "now-10m",
        "lt": "now"
      }
    }
  }
}

有没有办法组合两个查询?

3 个答案:

答案 0 :(得分:1)

我上面的家伙是正确的,但是他们都为[添加了多余的]must,这意味着对匹配字段的查询超过了。

GET _search
{
  "query": {
    "bool" : {
      "must" : {
        "match" : {  "log": "ERROR" }
      },
     "filter": 
        {
          "range": {
            "msgSubmissionTime": {
               "gte": "now-10m",
               "lte": "now"
            }
          }
        }
    }
  }
}

答案 1 :(得分:0)

可以。 它可以通过两种方式完成:使用过滤和布尔查询。

Elastic建议使用过滤器预过滤结果-与查询相比,它们更快。

布尔查询可以通过AND,OR,NOT运算符来合并不同的查询。

在Elastic官方文档中,您可以找到几乎符合您的问题的示例-elasticsearch documentation

因此您的查询将如下:

{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "log": "ERROR"
          }
        }
      ],
      "filter": {
        "range": {
          "msgSubmissionTime": {
            "gte": "now-10m",
            "lte": "now"
          }
        }
      }
    }
  }
}

答案 2 :(得分:0)

尝试一下。

{
  "query": {
    "bool": {
      "filter": {
        "range": {
          "msgSubmissionTime": {
            "gte": "now-10m",
            "lt": "now"
          }
        }
      },
      "must": [
        {
          "term": {
            "log" : "ERROR"
          }
        }
      ]
    }
  }
}