在 ElasticSearch 中,只有當事件發生在天數或特定持續時間中的name確切x時間時,我才需要獲取記錄。n
樣本指標資料如下:
{"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 專家可以幫助我嗎?
uj5u.com熱心網友回復:
您可以使用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
}
}
]
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/485199.html
