Logstash - 使用Grok匹配模式将结果分成不同的对象

时间:2017-02-27 13:19:17

标签: elasticsearch logstash logstash-grok

所以目前我正在分析我的MySQL字幕数据库中的数据,并将它们放入ElasticSearch 5.2中。无论如何,我的ES logstash具有以下过滤器:

filter {
    grok {
           match => ["subtitles", "%{TIME:[_subtitles][start]} --> %{TIME:[_subtitles][end]}%{GREEDYDATA:[_subtitles][sentence]}" ]
          }
}

产生以下内容:

"_subtitles": {
                  "sentence": [
                     "im drinking latte",
                     "im drinking coffee",
                     "while eating a missisipi cake"
                  ],
                  "start": [
                     "00:00:00.934",
                     "00:00:01.934",
                     "00:00:04.902"
                  ],
                  "end": [
                     "00:00:02.902",
                     "00:00:03.902",
                     "00:00:05.839"
                  ]
               }

但我想要的是:

 "_subtitles": [
                     {
                          "sentence": "im drinking latte",
                          "start": "00:00:00.934",
                          "end": "00:00:02.902"
                       },
                     {... same structure as above},
                     {... same structure as above},
]

请记住_subtitles将嵌套在预定义的映射中。

原始数据如下:

00:00:00.934 --> 00:00:02.902
im drinking latte

00:00:01.934 --> 00:00:03.902
im drinking coffee

00:00:04.902 --> 00:00:05.839
while eating a missisipi cake

如何使用Grok的匹配模式和占位符来实现这一目标?

2 个答案:

答案 0 :(得分:0)

经过大量的研究和阅读后,我发现了答案

我发现最好的方法是: - 保留Logstash并使用我自己的脚本从mysql迁移到Elastic,但是我必须进行所有模式识别和替换,这可能会变得有些复杂。 - 使用Ruby脚本/过滤器对字段进行后处理。

解决方案如下:

ruby {
      code => "
        subtitles = []
        starts = event.get('start')
        ends = event.get('end')
        sentences = event.get('sentence')
        counter = 0
        starts.each do |v|
         temp_hash = {}
         temp_hash['index'] = counter
         temp_hash['start'] = v
         temp_hash['end'] = ends[counter]
         temp_hash['sentence'] = sentences[counter]
         counter += 1
         subtitles.push(temp_hash)
        end
        event.set('subtitles', subtitles)
      "
  }

希望有所帮助。

但是现在我正在尝试改进这个,因为我的ElasticSearch容器失败了,因为“无法处理请求”/暂时停止...仅仅因为索引(目前大约20k)从mysql行到Elastic,每个都有大约40个嵌套对象。

我能做些什么来加快速度?

也许是一种标记文档的方法所以我不处理它们并将它们标记为前一天处理或某些处理?

谢谢, 问候。

答案 1 :(得分:0)

我说更好的方法是首先使用split filter,将内容拆分为单独的短语事件http://localhost:50593/api/fleet/2df3893d-c406-48fe-8443-1622ddc51af2/selectedfleet,然后使用grok(这将一次拆分单个字幕) )。