2015-11-02 60 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。我会看看这些是嵌套文件。非常感谢你! –