2016-01-22 83 views
1

我有一個包含對象eventvalue-eventtime的索引。我想編寫一個查詢,該查詢將返回最近30秒內基於eventvalue的聚合事件計數。另外,如果在給定的秒數內沒有事件,我需要空桶 - 我需要在圖上顯示這些數據。elasticsearch中的範圍查詢無法正常工作

所以我寫了下面的查詢:

{ 
    "query" : { 
     "bool" : { 
      "must" : [ 
       { 
        "range" : { 
         "eventtime" : { 
          "gte" : "now-30s/s", 
          "lte" : "now/s", 
          "format" : "yyyy-MM-dd HH:mm:ss", 
          "time_zone": "+03:00" 
         } 
        } 
       }, 
       { 
        "range" : { 
         "eventvalue" : { 
          "lte" : 3 
         } 
        } 
       } 
      ] 
     } 
    }, 
    "aggs": { 
     "values_agg": { 
      "terms": { 
       "field": "eventvalue", 
       "min_doc_count" : 0, 
       "order": { 
        "_term": "asc" 
       } 
      }, 
      "aggs": { 
       "events_over_time" : { 
        "date_histogram" : { 
         "field" : "eventtime", 
         "interval" : "1s", 
         "min_doc_count" : 0, 
         "extended_bounds" : { 
          "min" : "now-30s/s", 
          "max" : "now/s" 
         }, 
         "format" : "yyyy-MM-dd HH:mm:ss", 
         "time_zone": "+03:00" 
        } 
       } 
      } 
     } 
    } 
} 

該查詢不能正常工作,我不知道爲什麼。具體來說,第一個「範圍」查詢給我期望的時間間隔(如果我刪除它,我從所有時間獲得值)。但第二個「範圍」查詢似乎沒有效果。 Eventvalue的值可以是1到10之間的任何值,並且期望的效果是我將有三個存儲桶用於事件值1-3。不過,我得到所有事件的10個桶。

我該如何解決這個查詢,所以它仍然返回空桶,但只爲選定evenvalues?

+0

您可以檢查映射'eventvalue',讓我們知道它是什麼設置? ('string','long'或'double') –

+0

@Weinberger eventvalue是整數。 – Alex

回答

1

我相信你需要從你的terms彙總中刪除"min_doc_count": 0。要實現您正在瞄準的空桶,只需在date_histogram彙總中使用min_doc_count

documentation的條款聚集:

設置min_doc_count = 0也將返回水桶對於未 比賽命中的條款。

這就解釋了爲什麼你看到桶進行eventvalue S中的大於3。他們被查詢過濾掉,而是由術語聚集帶回來。

UPDATE

既然有一種可能性,即eventvalues可能無法在30秒的時間片的任何地方存在,另一種方法,我建議是手動指定要作爲水桶使用離散值使用filters彙總。請參閱documentation here

嘗試使用此爲您彙總:

"aggs": { 
    "values_agg": { 
    "filters": { 
     "filters": { 
     "1": { "term": { "eventvalue": 1 }}, 
     "2": { "term": { "eventvalue": 2 }}, 
     "3": { "term": { "eventvalue": 3 }} 
     } 
    }, 
    "aggs": { 
     "events_over_time" : { 
     "date_histogram" : { 
      "field" : "eventtime", 
      "interval" : "1s", 
      "min_doc_count" : 0, 
      "extended_bounds" : { 
      "min" : "now-30s/s", 
      "max" : "now/s" 
      }, 
      "format" : "yyyy-MM-dd HH:mm:ss", 
      "time_zone": "+03:00" 
     } 
     } 
    } 
    } 
} 
+0

我無法刪除它。我試過了。然後我得到完全空的結果。 – Alex

+0

你可以更新你的問題,並提供一些樣本文件?我用我最好的方式猜測你的文檔是如何構建的,並且能夠得到你正在尋找的結果,我創建了一個測試索引。 – BrookeB

+0

另外,你使用的是什麼版本的ES? – BrookeB