web-dev-qa-db-fra.com

Trouvez des valeurs distinctes et non des comptes distincts dans elasticsearch

Documentation Elasticsearch suggère* que leur morceau de code 

* documentation corrigée

GET /cars/transactions/_search?search_type=count
{
  "aggs": {
    "distinct_colors": {
      "cardinality": {
        "field": "color"
      }
    }
  }
}

correspond à requête SQL 

SELECT DISTINCT(color) FROM cars

mais cela correspond en fait à 

SELECT COUNT(DISTINCT(color)) FROM cars

Je ne veux pas savoir combien de valeurs distinctes j'ai, mais quelles sont les valeurs distinctes. Quelqu'un sait comment y parvenir?

25
jasiustasiu

Utilisez une agrégation terms sur le champ color. Et vous devez faire attention à la façon dont le champ sur lequel vous souhaitez obtenir des valeurs distinctes est analysé, ce qui signifie que vous devez vous assurer de ne pas le tokeniser lors de l'indexation, sinon chaque entrée de l'agrégation sera un terme différent qui fait partie le contenu du champ.

Si vous souhaitez toujours utiliser la tokenisation ET utiliser l'agrégation terms, vous pouvez consulter le type d'indexation not_analyzed pour ce champ et éventuellement utiliser multi field .

Agrégation de termes pour les voitures:

GET /cars/transactions/_search?search_type=count
{
  "aggs": {
    "distinct_colors": {
      "terms": {
        "field": "color",
        "size": 1000
      }
    }
  }
}
27
Andrei Stefan

Pour mettre à jour l'excellente réponse de Andrei Stefan, nous devons dire que le paramètre de requête search_type=count n'est plus pris en charge dans Elasticsearch 5. La nouvelle méthode consiste à ajouter "size" : 0 dans le corps, par exemple: 

GET /cars/transactions/_search
{
  "size": 0,
  "aggs": {
    "distinct_colors": {
      "terms": {
        "field": "color",
        "size": 1000
      }
    }
  }
}
21
Ortomala Lokni

Personnellement, les deux réponses étaient obscures pour moi et désespérément complexes lorsque je voulais ajouter plusieurs filtres.

Pour moi, le mieux était d'aller dans l'onglet Découvrir et d'appliquer les filtres que je voulais. J'ai ensuite sauvegardé ma recherche.

Ensuite, j'ai créé une nouvelle visualisation de graphique à barres à l'aide de ma recherche enregistrée. J'ai ensuite modifié l'axe des X pour utiliser l'agrégation de termes en fonction de mon domaine d'intérêt (dans mon cas, les noms d'utilisateur), puis l'ordre par nombre. Assurez-vous que la taille est quelque chose de grand, comme 500.

Vous devriez pouvoir obtenir les résultats sous forme de tableau sous votre graphique. Programmation JSON simple et sans complexité. Juste une série de clics. Vous pouvez même enregistrer la visualisation pour plus tard.

1
Phlucious