Logstash MySQL组合了多行

时间:2017-03-22 23:23:39

标签: elasticsearch logstash

我一直在使用logstash,并且能够将我的一些MySQL表插入到Elastic搜索中。

现在,我需要将MySQL Query statememt中的多行组合成一个文档。例如,假设我有一个mySQL查询,我有以下结果,

1   Group1  Company1    User1
1   Group1  Company1    User2
1   Group2  Company2    User3
1   Group2  Company2    User4

我想在Elastic Search for Group1和Group2中创建2个Group文档。在Group1中,我需要添加User1和User2。在Group2中,我需要添加User3和User4。

使用LogStash并结合某些过滤器可以实现吗?如果有的话,任何人都可以指出我正确的方向。

1 个答案:

答案 0 :(得分:6)

您可以使用logstash-filter-aggregate。过滤器采用task_id(在您的情况下为组字段),并聚合具有相同task_id值的行。因此,将聚合具有group1的事件,然后当筛选器检测到新的组值时,group1的聚合用户数据将作为单个Logstash事件推送,以输出到您的elasticsearch文档。然后,它使用group2启动该过程。

确保将logstash过滤器工作程序设置为1(-w 1标志或配置文件中),并按所有group1事件进入的方式对行进行排序,然后对所有group2等进行排序。否则,事件可能会不按顺序处理,并可能导致意外的结果/数据丢失。

filter {
  aggregate {
    task_id => "%{group}"
    code => "
      map['users'] ||= []
      map['users'].push(event.get('user'))
    "
    push_previous_map_as_event => true
    timeout_tags => ['aggregated']
  }

  if "aggregated" not in [tags] {
    drop {}
  }
}

结果将如下所示:

"_source": {
  "group": "group1",
  "users": ["user1", "user2"]
}