2015-03-03 40 views
0

我有一個將時間序列數據寫入Elasticsearch的應用程序。 (簡化的)數據如下所示:計算時間序列值的更改率

{ 
    "timestamp": 1425369600000, 
    "shares": 12271 
}, 
{ 
    "timestamp": 1425370200000, 
    "shares": 12575 
}, 
{ 
    "timestamp": 1425370800000, 
    "shares": 12725 
}, 
... 

我現在想用的聚合通過時間來計算shares場的變化率「桶」,例如像

變化率在過去的10分「桶」中的份額值的可恕我直言計算

# of shares t1 
-------------- 
# of shares t0 

我試過日期直方圖聚集,但我想這不是我需要計算的變化率,因爲這樣只會給我的doc_count,這是我不明白我怎麼能計算出這些變化率:

{ 
    "aggs" : { 
     "shares_over_time" : { 
      "date_histogram" : { 
       "field" : "timestamp", 
       "interval" : "10m" 
      } 
     } 
    } 
} 

有沒有辦法實現我的內Elasticsearch聚合目標是什麼?我搜索文檔,但沒有找到匹配的方法。

非常感謝您的幫助!

+0

嗨Tobi,你能解決這個問題嗎?你能分享一個更新嗎? – 2016-01-24 13:49:59

回答

1

我認爲使用開箱即用的聚合函數很難實現。但是,您可以查看percentile_ranks_aggregation並將您自己的修改添加到腳本以創建時間點費率。

此外,抱歉的頂部,但我想知道:是彈性搜索最適合這種東西?據我所知,在任何給定的時間點,您只需要以前的樣本數據來計算當前樣本的正確速率。這對我來說似乎更適合於某些sliding window algorithm實時實現(即使在像Postgres這樣的一些關係數據庫上),在那裏你保持固定數量的時間桶和你感興趣的計數器。一旦新樣本「到達」,您更新(滑動)窗口並計算最近時間段的更新速率。

+0

感謝您的回答。實際上,我想根據變化率來計算圖表,例如最近的100個數據點。我可以過濾'timestamp'字段。我真的很想使用ES,儘管我還找不到解決方案。我知道InfluxDB例如有一個'dfference()'函數,它可以實現我想實現的功能(http://influxdb.com/docs/v0.8/api/aggregate_functions.html#difference),但我有點猶豫向我的堆棧添加另一項技術。 – Tobi 2015-03-03 09:34:37

+0

感謝您分享influxdb的鏈接!如果不可能計算和存儲事件發生時的速率,那麼在elasticsearch上實現它很可能需要一些腳本。祝你好運! – aviad 2015-03-03 10:24:53