获取在所需持续时间内恰好发生 x 次的事件的详细信息

Fetch the details of events occurred exactly x times in desired duration

在 ElasticSearch 中,仅当事件 namen 天或特定持续时间内恰好发生 x 次时,我才需要获取记录。

示例索引数据如下:

{"event":{"name":"event1"},"timestamp":"2010-06-20"}

我能够获取特定持续时间内所需事件名称最少出现的记录。但我想要的不是最小值,而是精确匹配的计数。这是我的尝试:

{
  "_source": true,
  "size": 0, 
  "query": { 
    "bool": {
      "filter":
      {
        "range": { "timestamp": { "gte": "2010", "lte": "2016" }}
      },
      "must":
      [
        { "match": { "event.name.keyword": "event1" }}
      ]
    }
  },
  "aggs": {
    "occurrence": {
      "terms": {
        "field": "event.name.keyword",
        "min_doc_count": 5,
        "size": 10
      }
    }
  }
}

另一种实现相同目的的方法是使用 value_count。但在这里,我也无法添加条件来匹配确切的事件。

{
  "_source": true,
  "size": 0, 
  "query": { 
    "bool": {
      "filter":
      {
        "range": { "timestamp": { "gte": "2010", "lte": "2016" }}
      },
      "must":
      [
        { "match": { "event.name.keyword": "event1" }}
      ]
    }
  },
  "aggs": {
    "occurrence": {
      "value_count": {
        "field": "event.name.keyword"
      }
    }
  }
}

它提供的输出为(为简洁起见,删除了其他输出):

  "aggregations" : {
    "occurrence" : {
      "value" : 2
    }
  }

但我需要在 aggr 的输出中添加一个条件(此处为 occurrence)以精确匹配事件,以便仅当事件恰好发生 x 次时我才能获取记录。

一些 ES 专家可以帮助我吗?

您可以使用 Bucket Selector Aggregation 并为计数添加如下所示的条件。下面的查询只会给你总共发生 5 次的事件。您可以为要应用的任何过滤器添加查询子句,例如日期范围或事件名称或其他任何内容。

{
  "size": 0,
  "aggs": {
    "count": {
      "terms": {
        "field": "event.name.keyword",
        "size": 10
      },
      "aggs": {
        "val_count": {
          "value_count": {
            "field": "event.name.keyword"
          }
        },
        "selector": {
          "bucket_selector": {
            "buckets_path": {
              "my_var1": "val_count"
            },
            "script": "params.my_var1 == 5"
          }
        }
      }
    }
  }
}

您将得到如下结果:

"aggregations" : {
    "count" : {
      "doc_count_error_upper_bound" : 0,
      "sum_other_doc_count" : 0,
      "buckets" : [
        {
          "key" : "event1",
          "doc_count" : 5,
          "val_count" : {
            "value" : 5
          }
        },
        {
          "key" : "event8",
          "doc_count" : 5,
          "val_count" : {
            "value" : 5
          }
        }
      ]
    }
  }