Elasticsearch对具有不同字段的文档进行条件筛选

时间:2015-11-02 11:06:53

标签: elasticsearch elastalert

我有以下文件:

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. 如果来自doctypeA的ReceivedCount大于0,则获取 来自doctypeB的SuccessCount。
  2. 如果它们不匹配,则使用elastalert提醒。
  3. 我对弹性搜索和弹性模型有基本的了解。

    我试图了解elasticserach脚本来查询elasticsearch,但由于两个记录中的不同列而无法做到这一点。

    请指导。

1 个答案:

答案 0 :(得分:0)

我即将发布并回答建议使用nestedparent-child文件来执行此操作"加入"但后来我意识到仍然无法为文档A的字段值与doc B的值不同的文档创建查询。

您可以使用terms aggregation获取AcceptedCount的不同值,然后为每个不同的值x查询"文档WHERE AcceptedCount = x AND SuccessCount! = x" (使用mustmust_not使用term filter)。如果不同AcceptedCount值的数量较少,则不应该具有非常糟糕的性能,不同的过滤器可以放在单个should块中,因此单个ES查询就足够了。

此查询可以在component_type AB存储在nested documents中的文档上执行。如果还有其他组件类型,那么您也需要嵌套文档。文档' _id将从"自然键"生成timestamphoststart_type