2015-11-02 70 views
0

我有這樣的文件:Elasticsearch對文檔條件過濾器與不同領域

Type 1 (stats from component A) - 
_sources { 
    "@version": "1", 
    "@timestamp": "2015-11-02T06:50:11.170Z", 
    "stat_type": 1, 
    "ConnectionCount": 1, 
    "ReceivedCount": 2, 
    "AcceptedCount": 0, 
    "host": "my-pc", 
    "component_type": "A", 
} 

Type 2 (Stats from component B) - 
_sources { 
    "@version": "1", 
    "@timestamp": "2015-11-02T06:50:11.170Z", 
    "stat_type": 1, 
    "SuccessCount": 2, 
    "host": "my-pc", 
    "component_type": "B", 
} 

從這兩種類型的文檔,我想要做以下的事情 -

  1. 如果ReceivedCount從doctypeA大於0,然後從doctypeB獲取 SuccessCount。
  2. 如果它們不匹配,則使用elastalert進行警報。

我有elasticsearch和elastalert的基礎知識。

我試圖理解elasticserach腳本來查詢elasticsearch,但不能這樣做,因爲兩個記錄中的不同列。

請指導。

+0

我不確定ES的文檔模型是否適合您描述的任務。當組件B的數據可用時,您是否需要定期或實時運行此檢查? BTW時間戳字段似乎被棄用,文檔建議您使用正常的日期時間字段並明確設置其值。 https://www.elastic.co/guide/en/elasticsearch/reference/current/mapping-timestamp-field.html – NikoNyrh

+0

@NikoNyrh我需要定期運行此檢查,間隔5分鐘。感謝您的棄用信息。 –

回答

0

我要發佈並回答提示使用nestedparent-child文件來執行這個「加盟」但後來我意識到它仍然是不可能創造「的文件查詢,其中DOC A的字段值是不同的值DOC B

你可以使用terms aggregation獲得的AcceptedCount不同的值,然後對每個不同的值x查詢 「文件WHERE AcceptedCount = x AND SuccessCount!= x」(使用mustmust_notterm filter)。該不該」我的表現非常糟糕f不同的AcceptedCount值的數量很低,可以將不同的過濾器放在一個should塊中,因此一個ES查詢就足夠了。

此查詢可以在component_typeAB存儲在nested documents的文檔上執行。如果還有其他組件類型,那麼你也需要嵌套文件。文檔'_id將從timestamp,hoststart_type的「自然鍵」生成。

+0

只要使用SQL數據庫並執行JOIN就可以更簡單些,我認爲只有當您已經使用Logstash和Kibana時,ES纔有用。 – NikoNyrh

+0

謝謝你的回覆。我已經使用logstash和kibana,所以它不可能使用sql db。我會看看這些是嵌套文件。非常感謝你! –