Trier un champ String dans Kibana

Bonjour,

Est-il possible dans Kibana, onglet "Discover" de trier les résultats dans l'odre alphabétique d'un champ de type string ? Il n'y a pas la petite flèche pour tier à coté du nom du champ.
Exemple : mes documents contiennent 3 champs, Nom, prénom, age. Je recherche toutes les personnes ayant l'age compris entre X et Y, et je veux trier par leur Nom.
J'arrive à trier par age, car c'est un type Number, mais je n'arrive pas à trier par un champ de type Srtring.

Merci.

Bonjour,
Si le champs est de type keyword et donc aggregatable dans l'index pattern, le sorting est possible.
Sur un champs analysé (de type "text"), non ceci causerai des problemes de performance/memoire - voir https://www.elastic.co/guide/en/elasticsearch/reference/current/fielddata.html#fielddata-disabled-text-fields
En d'autre mots, pour de l'aggregation sorting, il faut utiliser keyword qui ne semble pas etre le cas ici ?

Juste au cas ou Elasticsearch est en version 2.x, voir https://www.elastic.co/blog/strings-are-dead-long-live-strings (string analyzed est devenu text et string not_analyzed est devenu keyword depuis 5.0)

2 Likes

Voici le mapping de mon champ :

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

J'utilise logstash pour faire le mapping.
logstash récupère un champ text dans un .csv et applique un mapping par défaut sur ce champ.
Dois-je faire un mutate { convert ... } sur ce champ pour pourvoir le trier dans Kibana?
Un truc dans ce style (mais dans la doc de logstash je ne vois pas la possibilité de faire un convert vers un type keyword :

    mutate {
              convert => { "Nom" => "keyword" }
    }

Le champ "Nom" ici est de type text et il n'est pas aggregatable - voir https://github.com/elastic/kibana/issues/7419

Si le mapping est celui-ci, sorting fonctionnera dans Discover :

"Nom": {
        "type": "keyword",
        "ignore_above": 256
      }

Pour appliquer le mapping il faut utiliser un template.

Utiliser le mapping par default avec multi-field text+keyword quand un string est détecté est généralement juste un point de depart pour créer le template (keyword est pour pouvoir faire du sorting/aggregation, text pour la recherche et il est possible de ne pas indexé si aucune des deux fonctionnalité est nécessaire pour le champs)

Merci Julien, c'est bien ça, merci.
Je fait mon mapping automatiquement via logstash, j'ai l'impression qu'il ne me permet pas de mapper un type keyword : https://www.elastic.co/guide/en/logstash/current/plugins-filters-mutate.html#plugins-filters-mutate-convert
Sinon il faudra que je fasse mon mapping sans passer par logstash.

logstash permet d'installer un index template avec le plugin output elasticsearch mais generalement il vaut mieux le faire hors de logstash (pour ne pas donner la permission manager_template a l'utilisateur qui a juste besoin de pouvoir ecrire sur un index ou un alias)
Donc s'il n'y a pas de template, en effet c'est bien elasticsearch qui choisit automatiquement le mapping. Si la donnée du premier document de l'index est un string, par default cela genere 2 champs "text" et "keyword", et Discover ne listera pas le champs "Nom.keyword" et donc ne permet pas de mettre en ordre par "Nom" car c'est un champs texte (comme discuter dans https://github.com/elastic/kibana/issues/7419)