在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次时才获得记录。
ESMaven能帮我解决这个问题吗?
1条答案
按热度按时间sg3maiej1#
您可以使用Bucket Selector Aggregation并添加如下所示的计数条件。下面的查询将为您提供总共发生5次的事件。您可以为您想要应用的任何筛选器添加查询子句,如日期范围或事件名称或任何其他内容。
您将得到如下结果: