Elasticsearch – Templates d’index

Petite astuce, toujours dans l’écosystème Elasticsearch avec lequel je joue pas mal en ce moment…

J’ai pas mal galéré à créer un mapping personnalisé pour importer des données via un river JDBC (GLPI Dashboard), mes champs strings passaient automatiquement en « analyzed » et pour jouer avec dans Kibana, c’est pas la joie…

Je me suis rendu compte que quand on utilise logstash, par défaut il detecte automatiquement les champs, et pour ceux qui sont « analysés », il ajoute un « champ.raw » qui contient la donnée brute. J’ai donc cherché un peu de ce côté là et j’ai vu qu’il était possible de créer des templates de mappings en fonction des index!

J’ai donc dupliqué le template par défaut de logstash. Toujours avec le plugin sense, un petit « get template/logstash » pour le récupérer et le modifier de la façon suivante (rien de glorieux, j’ai juste changé le nom 🙂 )

put _template/nomtemplate
    {
  "template" : "nomtemplate-*",
  "settings" : {
    "index.refresh_interval" : "5s"
  },
  "mappings" : {
    "_default_" : {
       "_all" : {"enabled" : true, "omit_norms" : true},
       "dynamic_templates" : [ {
         "message_field" : {
           "match" : "message",
           "match_mapping_type" : "string",
           "mapping" : {
             "type" : "string", "index" : "analyzed", "omit_norms" : true
           }
         }
       }, {
         "string_fields" : {
           "match" : "*",
           "match_mapping_type" : "string",
           "mapping" : {
             "type" : "string", "index" : "analyzed", "omit_norms" : true,
               "fields" : {
                 "raw" : {"type": "string", "index" : "not_analyzed", "ignore_above" : 256}
               }
           }
         }
       } ],
       "properties" : {
         "@version": { "type": "string", "index": "not_analyzed" },
         "geoip"  : {
           "type" : "object",
             "dynamic": true,
             "properties" : {
               "location" : { "type" : "geo_point" }
             }
         }
       }
    }
  }
}

Ensuite dans la section output de logstash, ou dans les paramètres du river, peu importe la source, il suffit d’aller écrire dans un index correspondant au pattern « nomtemplate-* » et ES va faire sa sauce tout seul!

Par exemple en gardant le format de nommage par défaut de logstash:

output {
  elasticsearch { host => "elasticsearchhost"
                  protocol => "http"
                  index => "nomtemplate-%{+YYYY.MM.dd}"
                }
}

A partir de la, on peut récupérer au besoin les champs analysés ou bruts dans Kibana!

Ca va me simplifier la vie cette histoire.

1 commentaire

  1. Bonjour,
    je viens de lire votre article qui au titre semblait répondre à mon problème, mais dans le fond, ce n’est pas le cas, je me suis dit que vous pourriez peut être m’aider.
    J’utilise Logstash avec le plugin HTTP en input et elasticsearch en output.
    Je cherche à importer des données en JSON mais j’ai une erreur qui apparaît à chaque tentative:
    « Limit of total fields [1000] in index [index] has been exceeded »
    En cherchant sur le net, j’ai compris qu’il fallait que je modifie le template d’elasticsearch de sorte à ce que mes données soient listées en lignes et non pas en colonnes.
    Pourriez-vous m’aider/m’orienter vers une solution de construction de template dans ce sens s’il vous plait?

    En vous remerciant par avance.

    Cordialement,

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée.