获取在所需持续时间内恰好发生 x 次的事件的详细信息
Fetch the details of events occurred exactly x times in desired duration
在 ElasticSearch 中,仅当事件 name
在 n
天或特定持续时间内恰好发生 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
}
}
]
}
}
在 ElasticSearch 中,仅当事件 name
在 n
天或特定持续时间内恰好发生 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
}
}
]
}
}