gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 22:38:13 24 4
gpt4 key购买 nike

所以目前我正在分析我的 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 的匹配模式和占位符来实现这一点?

最佳答案

因此,经过大量研究和阅读,我找到了答案

我发现最好的方法是:
- 离开 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 容器因“无法处理请求”之类的东西而失败/关闭了一段时间..只是因为索引(目前来自 mysql 的大约 20k 行)到具有大约 40 个嵌套对象的 Elastic 中每个。

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

也许是一种标记文档的方法,所以我不处理它们并将它们标记为前一天或 some'n 已处理?

谢谢,
问候。

关于elasticsearch - Logstash - 使用 Grok 匹配模式将结果分成不同的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42486824/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com