Afficher tous les résultats / buckets d'agrégation Elasticsearch et pas seulement 10


166

J'essaie de lister tous les seaux sur une agrégation, mais il semble ne montrer que les 10 premiers.

Ma recherche:

curl -XPOST "http://localhost:9200/imoveis/_search?pretty=1" -d'
{
   "size": 0, 
   "aggregations": {
      "bairro_count": {
         "terms": {
            "field": "bairro.raw"
         }
      }
   }
}'

Retour:

{
  "took" : 2,
  "timed_out" : false,
  "_shards" : {
    "total" : 5,
    "successful" : 5,
    "failed" : 0
  },
  "hits" : {
    "total" : 16920,
    "max_score" : 0.0,
    "hits" : [ ]
  },
  "aggregations" : {
    "bairro_count" : {
      "buckets" : [ {
        "key" : "Barra da Tijuca",
        "doc_count" : 5812
      }, {
        "key" : "Centro",
        "doc_count" : 1757
      }, {
        "key" : "Recreio dos Bandeirantes",
        "doc_count" : 1027
      }, {
        "key" : "Ipanema",
        "doc_count" : 927
      }, {
        "key" : "Copacabana",
        "doc_count" : 842
      }, {
        "key" : "Leblon",
        "doc_count" : 833
      }, {
        "key" : "Botafogo",
        "doc_count" : 594
      }, {
        "key" : "Campo Grande",
        "doc_count" : 456
      }, {
        "key" : "Tijuca",
        "doc_count" : 361
      }, {
        "key" : "Flamengo",
        "doc_count" : 328
      } ]
    }
  }
}

J'ai bien plus de 10 clés pour cette agrégation. Dans cet exemple, j'aurais 145 clés et je veux le décompte pour chacune d'elles. Y a-t-il une pagination sur les seaux? Puis-je tous les avoir?

J'utilise Elasticsearch 1.1.0

Réponses:


196

Le paramètre de taille doit être un paramètre pour l'exemple de requête de termes:

curl -XPOST "http://localhost:9200/imoveis/_search?pretty=1" -d'
{
   "size": 0,
   "aggregations": {
      "bairro_count": {
         "terms": {
            "field": "bairro.raw",
             "size": 0
         }
      }
   }
}'

Comme mentionné dans le document ne fonctionne qu'à partir de la version 1.1.0

Éditer

Mise à jour de la réponse basée sur le commentaire @PhaedrusTheGreek.

Le paramètre size:0est obsolète à partir de la version 2.x, en raison de problèmes de mémoire infligés à votre cluster avec des valeurs de champ à cardinalité élevée. Vous pouvez en savoir plus à ce sujet dans le numéro de github ici .

Il est recommandé de définir explicitement une valeur raisonnable pour sizeun nombre compris entre 1 et 2147483647.


8
Notez que le paramètre size: 0 est désormais obsolète, en raison de problèmes de mémoire infligés à votre cluster avec des valeurs de champ à cardinalité élevée. github.com/elastic/elasticsearch/issues/18838 . Au lieu de cela, utilisez un nombre réel et raisonnable entre 1 et 2147483647.
PhaedrusTheGreek

merci @PhaedrusTheGreek pour l'avoir signalé, j'ai édité la réponse pour incorporer votre commentaire.
keety

0 travaille sur 2.5.2. qu'entendez-vous par 2.x en avant? voulez-vous dire après la version 5? Je suis également curieux de savoir quel type de problèmes de mémoire cela peut-il causer si je veux retourner tous les aggs possibles, quelle serait la différence entre le réglage 0 (max_value) et 10000 (une grande limite supérieure)?
batmaci

4
@batmaci, il était obsolète dans 2.x donc fonctionnait toujours et a été supprimé de 5.x
keety

@batmaci Je crois que l'utilisation de la taille: <grand nombre> n'est pas moins gourmande en mémoire, mais rend simplement plus explicite au client qu'il y a un coût de performance. Je pense que c'est le raisonnement derrière la dépréciation size:0. Vous pouvez en savoir plus dans ce numéro de
keety

37

Comment afficher tous les seaux?

{
  "size": 0,
  "aggs": {
    "aggregation_name": {
      "terms": {
        "field": "your_field",
        "size": 10000
      }
    }
  }
}

Remarque

  • "size":10000Obtenez au plus 10000 seaux. La valeur par défaut est 10.

  • "size":0En conséquence, "hits"contient 10 documents par défaut. Nous n'en avons pas besoin.

  • Par défaut, les seaux sont classés par doc_countordre décroissant.


Pourquoi ai-je une Fielddata is disabled on text fields by defaulterreur?

Parce que fielddata est désactivé sur les champs de texte par défaut . Si vous n'avez pas explicitement choisi de mappage de type de champ, il a les mappages dynamiques par défaut pour les champs de chaîne .

Donc, au lieu d'écrire, "field": "your_field"vous devez avoir "field": "your_field.keyword".


Le fait d'avoir une taille plus grande pour les buckets affecte-t-il les performances (temps d'exécution de la requête) de la requête de recherche élastique?
user3522967 le

Comment pouvons-nous ajouter une pagination pour les seaux?
Miind

7

Augmentez la taille (2ème taille) à 10000 dans vos agrégations de termes et vous obtiendrez le seau de taille 10000. Par défaut, il est défini sur 10. De plus, si vous souhaitez voir les résultats de la recherche, définissez simplement la première taille sur 1, vous pouvez voir 1 document, car ES prend en charge à la fois la recherche et l'agrégation.

curl -XPOST "http://localhost:9200/imoveis/_search?pretty=1" -d'
{
   "size": 1,
   "aggregations": {
      "bairro_count": {
         "terms": {
             "field": "bairro.raw",
             "size": 10000

         }
      }
   }
}'

4

Si vous souhaitez obtenir toutes les valeurs uniques sans définir de nombre magique ( size: 10000), utilisez AGRÉGATION COMPOSITE (ES 6.5+) .

De la documentation officielle :

"Si vous souhaitez récupérer tous les termes ou toutes les combinaisons de termes dans une agrégation de termes imbriqués vous devez utiliser l'AGREGATION COMPOSITE qui permet de paginer sur tous les termes possibles plutôt que de définir une taille supérieure à la cardinalité du champ dans l'agrégation des termes. L'agrégation de termes est destinée à renvoyer les termes principaux et ne permet pas la pagination. "

Exemple d'implémentation en JavaScript:

const ITEMS_PER_PAGE = 1000;

const body =  {
    "size": 0, // Returning only aggregation results: https://www.elastic.co/guide/en/elasticsearch/reference/current/returning-only-agg-results.html
    "aggs" : {
        "langs": {
            "composite" : {
                "size": ITEMS_PER_PAGE,
                "sources" : [
                    { "language": { "terms" : { "field": "language" } } }
                ]
            }
        }
     }
};

const uniqueLanguages = [];

while (true) {
  const result = await es.search(body);

  const currentUniqueLangs = result.aggregations.langs.buckets.map(bucket => bucket.key);

  uniqueLanguages.push(...currentUniqueLangs);

  const after = result.aggregations.langs.after_key;

  if (after) {
      // continue paginating unique items
      body.aggs.langs.composite.after = after;
  } else {
      break;
  }
}

console.log(uniqueLanguages);

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.