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



在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
}
}
]
}
}

最新更新