web-dev-qa-db-fra.com

Restreindre l'agrégation aux résultats du filtre

Étant donné un ensemble de documents qui ont une valeur donnée dans un champ, je veux savoir combien de documents ont chaque valeur pour un deuxième champ.

J'ai essayé de le faire avec une agrégation de termes avec la requête suivante:

{
    "size": 0,
    "filter": {
        "term": {
            "field1": "value"
        }
    },
    "aggregations": {
        "field2" : {
            "terms" : { "field" : "field2" }
        }
    }
}

mais les décomptes renvoyés montrent le nombre de documents avec chaque valeur pour le deuxième champ dans le index entier, et non limité aux documents avec une valeur donnée pour le premier champ.

Qu'est-ce que je fais mal?

19
user2463201

Avez-vous essayé d'utiliser une requête filtrée?

{
    "query": {
        "filtered": {
           "query": {
                "match_all": {}
           },
           "filter": {
               "term": {
                  "field1": "value"
               }
           }
        }
    },
    "aggregations": {
        "field2": {
           "terms": { "field": "field2" }
        }
    }
}
27
Mihai Ionescu

Il y a une comparaison ici: https://www.elastic.co/guide/en/elasticsearch/guide/current/_post_filter.html

En bref, votre filtre de niveau supérieur se comporte comme un post_filter dans le lien. Pour filtrer, puis calculer l'agrégat, vous devez utiliser une requête.

Si vous êtes préoccupé par les performances atteintes en raison du calcul des scores dans les requêtes, vous pouvez examiner les requêtes à score constant, qui sont essentiellement des requêtes de filtrage.

8
Mehmet K