我一直在使用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并结合某些过滤器可以实现吗?如果有的话,任何人都可以指出我正确的方向。
答案 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"]
}