Changer nom d’un champ

Bonjour,

Quelle est la meilleur solution pour changer le nom d’un champ?

J’utilise logstash pour faire le mapping.
Je crée 1 index par jour. Chaque index contient toujours le meme format / mapping de documents. Seulement voilà, j’aimerai modifier le nom d’un champ pourqu’il soit plus facile à saisir dans la recherche de Kibana.
Mais si je change le nom de ce champ dans mes nouveaux index, il faut aura l’ancien nom dans les anciens index, creant un pb d’homogeneité. Et tous mes dashboards se basent sur l’ancien nom du champ donc risquent d’etre incompatibles et generer des erreurs sur les index ayant le nouveau nom.

Est il possible de renommer d’une traite le nom de ce champs dans tous les anciens index?

Quelle est la meilleur facon de faire?

Merci

Bonjour @rbeg ,

Est-ce qu'un alias sur ton champ pourrait aider a résoudre ton problème?
https://www.elastic.co/guide/en/elasticsearch/reference/7.4/alias.html

1 Like

Voilà ce qui me semble être une réponse parfaite.

  1. L'alias pointe-t-il sur les mêmes index (au sens indexation) que le champ d'origine ?
    Dans ce cas, c'est nickel.
  2. Ou alors duplique-t-il les indexations ? Dans ce cas je vais utiliser inutilement de la mémoire, donc c'est nul...

Dans le premier cas de figure, est-ce réellement équivalent à utiliser le champ pointé par l'alias, ou est-ce que j'y perd quelque chose ?
En bref, est-ce que j'ai tout à gagner à utiliser un alias versus un re-nomage de mon champ ?
Mais je le sens bien ce coup là.

Merci grandement pour ta réponse Gabriel.

Oui l'alias pointe sur le champ, y'a pas de duplication de valeur. Donc c'est nickel!! :grin:

Regarde bien la section suivante certaines apis ne sont pas supportes (rien n'est parfait)
https://www.elastic.co/guide/en/elasticsearch/reference/7.4/alias.html#unsupported-apis

Vu que tu créer un index par jour tu peux mettre ton alias dans ton template et il s'appliquera a tout tes nouveaux index.

L'alias est fait pour gérer des cas similaire au tien, et éviter des reindexation pour renommer un champ.
Mettre a jour le mapping des anciens index c'est moins coûteux (en temps humain et machine) que renommer.

Merci infiniment.

J'ai cette erreur, une idée ?

Action :

PUT mediacom_idx_2019.11.08
{
  "mappings": {    
  "properties": {
  "Nu_cli_unformatted": {
    "type": "text"
  },
  "A_Number": {
    "type": "alias",
    "path": "Nu_cli_unformatted" 
  }
 }
}
}

Resultat en Erreur :

{
"error": {
"root_cause": [
  {
    "type": "resource_already_exists_exception",
    "reason": "index [mediacom_idx_2019.11.08/3gBFH-8kQiqldRtGWXVwmw] already exists",
    "index_uuid": "3gBFH-8kQiqldRtGWXVwmw",
    "index": "mediacom_idx_2019.11.08"
  }
],
"type": "resource_already_exists_exception",
"reason": "index [mediacom_idx_2019.11.08/3gBFH-8kQiqldRtGWXVwmw] already exists",
"index_uuid": "3gBFH-8kQiqldRtGWXVwmw",
"index": "mediacom_idx_2019.11.08"
},
"status": 400
}

Autre test :

PUT mediacom_idx_2019.11.08/_mapping
{
  "properties": {
    "A_Number": {
      "type": "alias",
      "path": "Nu_cli_unformatted"
    }
  }
} 

Resultat :

 {
"error": {
"root_cause": [
  {
    "type": "action_request_validation_exception",
    "reason": "Validation Failed: 1: mapping type is missing;"
  }
],
"type": "action_request_validation_exception",
"reason": "Validation Failed: 1: mapping type is missing;"
},
"status": 400
} 

Voici le mapping du champ initial :

          "Nu_cli_unformatted" : {
        "type" : "text",
        "fields" : {
          "keyword" : {
            "type" : "keyword",
            "ignore_above" : 256
          }
        }
      },

D'apres la doc et les limitations deja partages plus haut:

Likewise, aliases cannot be used as the target of copy_to or in multi-fields.

Tu peux pas utiliser d'alias pour les champs en multi-fields.

On retourne au probleme d'origine.
Le mieux c'est de reindexer les données de tes anciens index dans un nouveaux index et d'utiliser ingest pour copier ton champ si tu ne fait aucune modification sur tes anciennes données c'est parfait.

Tu peux aussi rajouter ton ingest sur ton index courant pour tout le temps dupliquer ton champ, du coup dans tout tes index ton champ sera 2 fois et sera compatible avec tes anciens dashboards.
Il y a sûrement des limitations si tu utilise l'API update mais je n'ai pas testé.

Il y a un exemple ici avec ingest:

Ou si tu utilise logstash t'as peut etre pas besoin d'utiliser ingest.

1 Like

En complément pour avoir une vue global de la différence entre l'utilisation de logstatsh et/ou ingest, tu peux lire le post suivant. Pour ton cas, juste renommer un champ c'est peut-être pas nécessaire mais pour une futur utilisation.

Bonjour Gabriel,
Merci pour tes reponses.
J’utilise logstash, donc ça me parait compliqué cette histoire d’alias vu le mapping de mon champ qui n’est pas supporté. Je pense que je ferai mieux de renommer mon champ, la seule chose qui m’embète c’est que je vais devoir modifier toutes mes visualizations qui se basent sur ce champ. Peut être que je pourrai faire ça rapidement en exportant toutes mes visualusations dans un fichier, renommant tous les anciens champs par le nouveau nommage avec un ctr-f, puis reimportant ce fichier dans kibana...