Comment puis-je obtenir les valeurs de tous les à languages
partir des enregistrements et les rendre uniques.
Registres
PUT items/1
{ "language" : 10 }
PUT items/2
{ "language" : 11 }
PUT items/3
{ "language" : 10 }
Requete
GET items/_search
{ ... }
# => Expected Response
[10, 11]
Toute aide est la bienvenue.
elasticsearch
ChuckJHardy
la source
la source
fields: [languages]
ne donnera que les valeurs du champ donné, mais les rendre uniques est probablement plus facile à faire dans le code. Cependant, il existe peut-être une agrégation pratique qui peut le faire pour vous.Réponses:
Vous pouvez utiliser les termes agrégation .
Une recherche renverra quelque chose comme:
Le
size
paramètre dans l'agrégation spécifie le nombre maximal de termes à inclure dans le résultat de l'agrégation. Si vous avez besoin de tous les résultats, définissez cette valeur sur une valeur supérieure au nombre de termes uniques dans vos données.la source
"fields" : ["language"]
ramène le même résultat. Pouvez-vous développer votre réponse pour voir si le cadre d'agrégation peut renvoyer uniquement les valeurs de langue?#=> [10, 11, 10]
language
vous pouvez ajoutersize=0
etshard_size=0
, pour vous assurer d'obtenir toutes les valeurs. Voir elasticsearch.org/guide/en/elasticsearch/reference/current/…Elasticsearch 1.1+ a l' agrégation de cardinalité qui vous donnera un décompte unique
Notez qu'il s'agit en fait d'une approximation et que la précision peut diminuer avec les ensembles de données à cardinalité élevée, mais elle est généralement assez précise dans mes tests.
Vous pouvez également régler la précision avec le
precision_threshold
paramètre. Le compromis, ou bien sûr, est l'utilisation de la mémoire.Ce graphique de la documentation montre comment une valeur plus élevée
precision_threshold
conduit à des résultats beaucoup plus précis.la source
si vous souhaitez obtenir le premier document pour chaque
language
valeur unique de champ, vous pouvez le faire:la source
Je recherche également ce genre de solution pour moi-même. J'ai trouvé des références en termes d'agrégation .
Donc, selon ce qui suit est la solution appropriée.
Mais si vous rencontrez l'erreur suivante:
Dans ce cas, vous devez ajouter " KEYWORD " dans la requête, comme suit:
la source
Si vous souhaitez obtenir toutes les valeurs uniques sans aucune approximation ni définir un nombre magique (
size: 500
), 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:
la source