elasticsearch Logstash-使用Grok匹配模式将结果分离到不同的对象中,elasticsearch,logstash,logstash-grok,elasticsearch,Logstash,Logstash Grok" /> elasticsearch Logstash-使用Grok匹配模式将结果分离到不同的对象中,elasticsearch,logstash,logstash-grok,elasticsearch,Logstash,Logstash Grok" />

elasticsearch Logstash-使用Grok匹配模式将结果分离到不同的对象中

elasticsearch Logstash-使用Grok匹配模式将结果分离到不同的对象中,elasticsearch,logstash,logstash-grok,elasticsearch,Logstash,Logstash Grok,因此,目前我正在分析MySQL字幕数据库中的数据,并将其放入ElasticSearch 5.2中。无论如何,my ES logstash具有以下过滤器: filter { grok { match => ["subtitles", "%{TIME:[_subtitles][start]} --> %{TIME:[_subtitles][end]}%{GREEDYDATA:[_subtitles][sentence]}" ] } }

因此,目前我正在分析MySQL字幕数据库中的数据,并将其放入ElasticSearch 5.2中。无论如何,my 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},
]
记住_字幕将通过预定义映射嵌套

原始数据如下:

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
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)
      "
  }
如何使用Grok的匹配模式和占位符实现这一点?

因此,经过大量研究和阅读,我找到了答案 我发现最好的方法是: -离开Logstash,编写我自己的脚本,从mysql迁移到Elastic,然后我必须完成所有的模式识别和替换,这可能会变得复杂。 -使用Ruby脚本/过滤器对字段进行后期处理

解决办法如下:

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
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容器失败,出现了“无法处理请求”之类的问题/出现了一段时间。。仅仅是因为将索引(目前mysql中的行数约为20k)转换为Elastic,每个索引大约有40个嵌套对象

我能做些什么来加快速度

也许是一种标记文档的方法,这样我就不会处理它们,并将它们标记为前一天处理过的文件或其他文件

谢谢,
关于。

我认为更好的方法是首先使用,使用
split{terminator=>“\n\n”}
将内容拆分为短语事件,然后使用grok(一次拆分一个字幕)。

已经拆分,但仍然必须使用grok,然后使用ruby,因为当grok拆分时,它只会将它们放在上面的主帖子中。顺便说一句,这里有一行代码:
event.set('subtitles',event.get('statement').zip(event.get('start'),event.get('end'),0..statemens.length-1)。map{t,s,e,i{'statement'=>t,'start'=>s,'end'=>e,'index'=>i}