2 votes

Logstash - Séparer les résultats dans différents objets en utilisant le modèle de correspondance Grok

Actuellement, j'analyse les données de ma base de données MySQL sur les sous-titres, et je les place dans ElasticSearch 5.2. Quoi qu'il en soit, mon logstash ES a le filtre suivant :

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

ce qui donne le résultat suivant :

"_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"
                  ]
               }

mais ce que je veux, c'est ça :

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

En gardant à l'esprit que les _sous-titres seront imbriqués par mappage prédéfini.

Et les données originales sont les suivantes :

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

Comment puis-je y parvenir en utilisant le modèle de correspondance et les caractères de remplacement de Grok ?

0voto

Abd Rmdn Points 73

Donc, après beaucoup de recherches et de lectures, j'ai trouvé LA RÉPONSE

J'ai trouvé que la meilleure façon de le faire est soit : - Laisser Logstash et faire mon propre script pour la migration de mysql vers Elastic, mais alors je devrais faire toute la reconnaissance des formes et le remplacement, ce qui peut devenir quelque part compliqué. - post-traiter les champs avec un script/filtre Ruby.

La solution était la suivante :

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)
      "
  }

J'espère que cela vous aidera.

Mais maintenant J'essaie d'améliorer cela, parce que mon conteneur ElasticSearch échoue avec quelque chose comme "cannot handle requests"/ s'éteint pendant un certain temps juste à cause de l'indexation (actuellement autour de 20k lignes depuis mysql) dans Elastic avec environ 40 objets imbriqués pour chacun.

Je peux faire quelque chose pour accélérer le processus ?

peut-être un moyen de marquer les documents pour que je ne les traite pas et les marquer comme traités le jour précédent ou autre ?

Merci, Salutations.

0voto

Stam Points 86

Je dirais que la meilleure approche est d'utiliser filtre divisé d'abord, pour diviser le contenu en plusieurs phrases-événements avec split { terminator => "\n\n" } et utiliser grok ensuite (qui divisera un seul sous-titre à la fois).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X