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

Elasticsearch: count documents from query match

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

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

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

获取时间范围:

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

有没有办法合并这两个查询?

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

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

布尔查询可以通过 AND、OR、NOT 运算符组合不同的查询。

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

所以您的查询将是这样的:

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

试试这个。

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

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

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