Logstash: champs imbriqués Modification du nom basé sur une condition

voix
0

Je suis en train de renommer les champs imbriqués de ElasticSearch tout en migrant vers Amazonelasticsearch

Dans le document, je veux changer le 1) Modifiez la valeur champ valeur_mot_clé si le champ de valeur est de type JSON de données 2) Modifiez la valeur champ pour la valeur standard si le champ de valeur a une taille de plus de 15

 _source: {
          applicationid : appid,
          interactionId: 716bf006-7280-44ea-a52f-c79da36af1c5,
          interactionInfo: [
            {
              value: {edited:false},
              title: msgMeta
            },
            {
              title: msg,
              value: hello testing,
            },
            {
              title: testing,
              value: I have a text that can be done and changed only the size exist more than 20 so we applied value-standard ,
            }
          ],
          uniqueIdentifier: a21ed89c-b634-4c7f-ca2c-8be6f31ae7b3,
        }
      }

le résultat final devrait être

 _source: {
          applicationid : appid,
          interactionId: 716bf006-7280-44ea-a52f-c79da36af1c5,
          interactionInfo: [
            {
              value-keyword: {edited:false},
              title: msgMeta
            },
            {
              title: msg,
              value: hello testing,
            },
            {
              title: testing,
              value-standard: I have a text that can be done and changed only the size exist more than 20 and so we applied value-standard  ,
            }
          ],
          uniqueIdentifier: a21ed89c-b634-4c7f-ca2c-8be6f31ae7b3,
        }
      }
Créé 24/10/2019 à 12:02
source utilisateur
Dans d'autres langues...                            


2 réponses

voix
0

Pour 2), vous pouvez le faire comme ceci:

filter {
    if [_source][interactionInfo][2][value] =~ /.{15,15}/ {

        mutate {
            rename => ["[_source][interactionInfo][2][value]","[_source][interactionInfo][2][value-standard]"]
        }
    }
}

La regex .{15,15}correspond à une chaîne de 15 caractères. Si le champ est inférieur à 15 caractères, l'expression rationnelle ne correspond pas et mutate#renamen'est pas appliquée.

Pour 1), une solution possible serait d'essayer d'analyser le champ avec le filtre JSON et s'il n'y a pas _jsonparsefailureétiquette, renommer le champ.

Créé 24/10/2019 à 17:14
source utilisateur

voix
0

Fondée la solution pour celui-ci. Je l'ai utilisé un filtre rubis Logstash pour vérifier chaque document ainsi que le document imbriqué Voici le code Ruby

require 'json'

def register(param)
end

def filter(event)
  infoarray = event.get("interactionInfo")
  infoarray.each {  |x|
      if x.include?"value"
         value = x["value"]
         if value.length > 15
           apply_only_keyword(x)
         end
       end
      if x.include?"value"
        value = x["value"]
         if validate_json(value)
           apply_only_keyword(x)
         end
       end
  }
event.set("interactionInfo",infoarray)
return [event]
end


def validate_json(value)
  if value.nil?
    return false
  end
  JSON.parse(value)
  return true
rescue JSON::ParserError => e
  return false
end

def apply_only_keyword(x)
  x["value-keyword"] = x["value"]
  x.delete("value")
  if x.include?"value-standard"
    x.delete("value-standard")
  end
  if x.include?"value-whitespace"
    x.delete("value-whitespace")
  end
end
Créé 14/11/2019 à 11:07
source utilisateur

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more