elasticsearch Logstash-使用Grok匹配模式将结果分离到不同的对象中
因此,目前我正在分析MySQL字幕数据库中的数据,并将其放入ElasticSearch 5.2中。无论如何,my ES logstash具有以下过滤器: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]}" ] } }
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}