Récupérer le nom des champs de mon index

Bonjour à tous,

Je débute avec la suite ELK et mon projet et de créer un plugin contenant 3 visualisation (un peu comme un dashboard).
Mon problème et le suivant je requête Elasticsearch qui me renvoie le bon index mais je voudrais pouvoir récupérer le nom des champs de cet index pour que l'utilisateur puisse sélectionner lui même les attributs à afficher dans mes visualisations.

code main.js :

const { httpClient } = this.props;
    httpClient.get('../api/HelloWorld/search_test/').then((response) => {
        console.log(response.data[0]); 
    });

code example.js :

   const client = new elasticsearch.Client({
		  host: 'localhost:9200',
		  log: 'trace'
			});

  server.route({
    path: '/api/HelloWorld/search_test/',
    method: 'GET',
    handler(req, reply) {
      const query =  req.params.searchterm;

     
	   return  client.search({
      "index": 'kibana_sample_data_ecommerce',
      "type": '_doc',
      "body": {
        "query": {
          "query_string" : {
              "fields" : ["_id"],
              "query" : "vJz2sGoBtbU1hayKOsCc OR vZz2sGoBtbU1hayKOsCc",
              "tie_breaker" : 0
          }
        }
      }	
     
		}).then(function (result) { // section de retour erreur et resultat de la recherche
      var result = result.hits.hits;
      return result;
      
		}, function (error) {
      
			console.trace(error.message);
    });
		}
  });

résultats :

{_index: "kibana_sample_data_ecommerce", _type: "_doc", _id: "vJz2sGoBtbU1hayKOsCc", _score: 1, _source: {…}}

Du coup je voudrais récupérer _index, __type, _id, _score (je parle bien du nom des champs pas de leurs valeurs) et j'aimerai que cela soit applicable quelque soit l'index récupéré
je tourne un peu en rond et je n'arrive pas trop à trouver mon chemin dans la documentation, je sollicite donc votre aide.

Merci d'avance
Simon Ledoit, aka Palpatoune

Ps: je m'excuse d'avance si je n'utilise pas le bon vocabulaire, je ne suis qu'un jeune étudiant de DUT :innocent:

Salut,

Pour récupérer les noms des champs d'un index d’après la doc y'a field_name mais chez moi ça marche pas. :sweat_smile:
https://www.elastic.co/guide/en/elasticsearch/reference/7.1/mapping-field-names-field.html

autre solution que j'utilise, je fais un GET ton_index/_mapping
et tu peux lister tous les champs derrière ton_index: { mappings :{ ton_type: {properties : { ton_chmap1 :{}, ton_champ2 ....

1 Like

Je vais essayer ça lundi, je te tiens au courant merci pour ton aide :hugs:

Je viens d'essayer ta solution malheureusement je n'arrive pas à la mettre en place, peut être que je m'y prend mal mais je vois pas trop comment faire.

Pour l'instant voici ce qu j'essaye de faire :

 server.route({
path: '/api/HelloWorld/search_test/',
method: 'GET',
handler(req, reply) {
  const query =  req.params.searchterm;

 
   return  client.search({
  "index": 'kibana_sample_data_ecommerce/',
  "type":"mappings",
  "field": {
   
      }
    	}).then(function (result) { // section de retour erreur et resultat de la recherche
  var result = result.hits.hits;
  return result;
  
	}, function (error) {
  
		console.trace(error.message);
});
	}

});

résultat:

"type": "illegal_argument_exception",
"reason": "request [/kibana_sample_data_ecommerce//mappings/_search] contains unrecognized parameter: [field]"

voila je bloque un peu, je me renseigne sur l'api d'Elastic et si je trouve quelque chose je vous tien au courant

Bonne journée, Simon Ledoit

Voici l'API get mapping d'elasticsearch: https://www.elastic.co/guide/en/elasticsearch/reference/current/indices-get-mapping.html

Je ne vois pas ce type d'appel dans ton code. Donc vérifie que tu appelles bien le bon endpoint.

1 Like

Merci pour ta réponse, en cherchant j'ai réussi a trouver l'API que tu me conseil et voici ce que j'ai fait:

const  request = new GetMappingsRequest();

mais GetMappingsRequest n'est pas défini je cherche donc maintenant quel import dois-je faire pour pouvoir utiliser cette fonction.

Merci encore pour ton aide, Simon Ledoit

Re bonjour,

après une multitude de test, j'ai un peu avancé et réussis a faire marcher GetMappingsRequest() :

 return  client.indices.getMapping('kibana_sample_data_ecommerce')

Mais ça ne marche toujours pas une nouvelle erreur est apparu:

"statusCode":400,"response":"{"error":{"root_cause":[{"type":"illegal_argument_exception","reason":"request [/_mapping] contains unrecognized parameters: [0], [1], [10], [11], [12], [13], [14], [15], [16], [17], [18], [19], [2], [20], [21], [22], [23], [24], [25], [26], [27], [3], [4], [5], [6], [7], [8], [9]"}],"type":"illegal_argument_exception

j'ai tronqué le message d'erreur car il est un peu long mais si vous le voulez en entier je peux vous le fournir.

Bonne journée, Simon ledoit

nouvelle découverte,
j'ai un peu bidouillé et j'en suis arrivé a ça :

 const map =  client.search({
    "index": 'kibana_sample_data_ecommerce',
    
    

      
    
        }).then(function (result) { // section de retour erreur et resultat de la recherche
    var result = result.hits.hits;
    return result;
    
  }, function (error) {
    
    console.trace(error.message);
  });
  
  return  client.indices.getMapping(map);

mais le résulta n'est pas du tout celui attendu, je ne récupère pas le mapping de mon index mais un mapping inconnu. (il est beaucoup trop long pour que je le poste sur le forum).

Je ne comprends pas trop ton code.
Le résultat de ta recherche est envoyé dans la fonction getMapping ?

C'est ça ?

Peut-être que ton client n'est pas compatible avec ta version de Elasticsearch ?

oui j'envoie bien le résultat de ma recherche dans la fonction getMapping, je sais pas si c'est la bonne méthode mais je me suis dis que comme ça il me donnerai le mapping de l'index que je recherche.
Sinon je ne comprend pas trop le problème avec mon client et comment puis-je le résoudre ?

Voila le genre de retour que je récupère ( il reste beaucoup d'infos au dessus que je n'ai pas copier pour pas non plus surcharger le post)

               "max_file_descriptor_count": {
                 "type": "long"
              },
              "num_alive_connections": {
                "type": "long"
              },
              "open_file_descriptor_count": {
                "type": "long"
              },
              "outstanding_requests": {
                "type": "long"
              },
              "packets": {
                "properties": {
                  "received": {
                    "type": "long"
                  },
                  "sent": {
                    "type": "long"
                  }
                }
              },
              "pending_syncs": {
                "type": "long"
              },
              "server_state": {
                "type": "keyword",
                "ignore_above": 1024
              },
              "synced_followers": {
                "type": "long"
              },
              "version": {
                "type": "alias",
                "path": "service.version"
              },
              "watch_count": {
                "type": "long"
              },
              "znode_count": {
                "type": "long"
              }
            }
          },
          "server": {
            "properties": {
              "connections": {
                "type": "long"
              },
              "count": {
                "type": "long"
              },
              "epoch": {
                "type": "long"
              },
              "latency": {
                "properties": {
                  "avg": {
                    "type": "long"
                  },
                  "max": {
                    "type": "long"
                  },
                  "min": {
                    "type": "long"
                  }
                }
              },
              "mode": {
                "type": "keyword",
                "ignore_above": 1024
              },
              "node_count": {
                "type": "long"
              },
              "outstanding": {
                "type": "long"
              },
              "received": {
                "type": "long"
              },
              "sent": {
                "type": "long"
              },
              "version_date": {
                "type": "date"
              },
              "zxid": {
                "type": "keyword",
                "ignore_above": 1024
              }
            }
          }
        }
      }
    }
  }
},
".kibana_task_manager": {
  "mappings": {
    "dynamic": "false",
    "properties": {
      "kibana": {
        "properties": {
          "apiVersion": {
            "type": "integer"
          },
          "uuid": {
            "type": "keyword"
          },
          "version": {
            "type": "integer"
          }
        }
      },
      "task": {
        "properties": {
          "attempts": {
            "type": "integer"
          },
          "interval": {
            "type": "text"
          },
          "params": {
            "type": "text"
          },
          "runAt": {
            "type": "date"
          },
          "scheduledAt": {
            "type": "date"
          },
          "scope": {
            "type": "keyword"
          },
          "state": {
            "type": "text"
          },
          "status": {
            "type": "keyword"
          },
          "taskType": {
            "type": "keyword"
          },
          "user": {
            "type": "keyword"
          }
        }
      },
      "type": {
        "type": "keyword"
      }
    }
  }
 }
}

Simon Ledoit

Salut,

Je pense que ce @dadoonet veux dire c'est que ton code n'est pas correct pour récupérer ton mapping t'as pas besoin de faire une recherche.

En plus dans ton résultat t'as la liste de tous les champs de tout tes index, ce qui explique la longueur.

Regarde la doc pour getMapping mais je parie que quelque chose comme ça devrait retourner un meilleur résultat.

return  client.indices.getMapping("kibana_sample_data_ecommerce");
1 Like

Si tu as bien lu l'API Get Mapping, tu devrais facilement te rendre compte qu'elle ne fonctionne pas en lui passant un résultat de recherche.

Je ne comprends pas ce que tu veux faire avec ça.

Mais bon, le résultat que tu as partagé semble être un résultat de Get Mapping correct. Quel est le problème avec ça maintenant ?

le problème est qu'il ne renvoi pas ce que je veux, je cherche a récupérer le mapping du mon index or il me renvoit un mapping que je ne connais pas, surement celui de l'objet client ?

Je suis retourné voir la doc comme tu me l'as conseillé la solution serait donc de faire:

client.indices.getMapping( "index" )

index étant l'index dont je cherche à récupérer le mapping.

Merci encore pour ton aide et je m'excuse si mes explication sont un peu confuse.
Simon ledoit

Bonjour Gabriel j'ai déjà pensé à cette solution malheureusement elle ne marche pas voici le résultat obtenu après test :

  error  [09:43:42.709] [warning][process] [illegal_argument_exception] request {"path":"/_mapping","query":{"0":"k","1":"i","2":"b","3":"a","4":"n","5":"a","6":"_","7":"s","8":"a","9":"m","10":"p","11":"l","12":"e","13":"_","14":"d","15":"a","16":"t","17":"a","18":"_","19":"e","20":"c","21":"o","22":"m","23":"m","24":"e","25":"r","26":"c","27":"e"}

en fin de compte il écrit :
0 K
1 i
2 b
3 a
...
en bref il réécris le nom de l'index passé en paramètre et non le mapping de cet index

Je pense avoir trouvé la solution en tout cas cela affiche bien ce que je cherche.
voici donc mon code :

const clientmapping = new elasticsearch.Client({
	  host: 'localhost:9200/kibana_sample_data_ecommerce',
	  log: 'trace'
		}); 
return clientmapping.indices.getMapping( );

si jamais mon code vous semble faux ou si vous ne comprenez pas mon raisonnement je reste à votre disposition :wink:
Simon Ledoit

This topic was automatically closed 28 days after the last reply. New replies are no longer allowed.