代码之家  ›  专栏  ›  技术社区  ›  Arkon

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

  •  2
  • Arkon  · 技术社区  · 6 年前

    我想得到在一个时间范围内与特定字符串匹配的文档数。

    如何在此查询中指定时间范围?

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

    要获取时间范围:

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

    有没有一种方法可以合并这两个查询?

    3 回复  |  直到 6 年前
        1
  •  1
  •   Green Moshe    6 年前

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

    GET _search
    {
      "query": {
        "bool" : {
          "must" : {
            "match" : {  "log": "ERROR" }
          },
         "filter": 
            {
              "range": {
                "msgSubmissionTime": {
                   "gte": "now-10m",
                   "lte": "now"
                }
              }
            }
        }
      }
    }
    
        2
  •  0
  •   Alex Baidan    6 年前

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

    Elastic建议使用过滤器对结果进行预过滤—它们比查询更快。

    在官方的弹性文件中,你可以找到几乎符合你的问题的例子- elasticsearch documentation

    {
      "query": {
        "bool": {
          "must": [
            {
              "match": {
                "log": "ERROR"
              }
            }
          ],
          "filter": {
            "range": {
              "msgSubmissionTime": {
                "gte": "now-10m",
                "lte": "now"
              }
            }
          }
        }
      }
    }
    
        3
  •  0
  •   Ashwani Shakya    6 年前

    试试这个。

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