Comment pourrais-je obtenir les valeurs de tous les languages
des enregistrements et les rendre uniques.
Records
PUT items/1
{ "language" : 10 }
PUT items/2
{ "language" : 11 }
PUT items/3
{ "language" : 10 }
Requête
GET items/_search
{ ... }
# => Expected Response
[10, 11]
Toute aide est la bienvenue.
Vous pouvez utiliser le agrégation de termes .
{
"size": 0,
"aggs" : {
"langs" : {
"terms" : { "field" : "language", "size" : 500 }
}
}}
Une recherche retournera quelque chose comme:
{
"took" : 16,
"timed_out" : false,
"_shards" : {
"total" : 2,
"successful" : 2,
"failed" : 0
},
"hits" : {
"total" : 1000000,
"max_score" : 0.0,
"hits" : [ ]
},
"aggregations" : {
"langs" : {
"buckets" : [ {
"key" : "10",
"doc_count" : 244812
}, {
"key" : "11",
"doc_count" : 136794
}, {
"key" : "12",
"doc_count" : 32312
} ]
}
}
}
Le paramètre size
de 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 une valeur supérieure au nombre de termes uniques dans vos données.
Elasticsearch 1.1+ a le agrégation de cardinalités qui vous donnera un nombre unique
Notez qu'il s'agit en réalité d'une approximation et que la précision peut diminuer avec les jeux de données à cardinalité élevée, mais elle est généralement assez précise lors de mes tests.
Vous pouvez également régler la précision avec le paramètre precision_threshold
. Le compromis, ou bien sûr, est l'utilisation de la mémoire.
Ce graphique de la documentation montre comment un precision_threshold
supérieur permet d'obtenir des résultats beaucoup plus précis.
Je cherche ce genre de solution pour moi aussi. J'ai trouvé une référence dans agrégation de termes .
Donc, d'après ce qui suit est la solution appropriée.
{
"aggs" : {
"langs" : {
"terms" : { "field" : "language",
"size" : 500 }
}
}}
Mais si vous rencontrez une erreur suivante:
"error": {
"root_cause": [
{
"type": "illegal_argument_exception",
"reason": "Fielddata is disabled on text fields by default. Set fielddata=true on [fastest_method] in order to load fielddata in memory by uninverting the inverted index. Note that this can however use significant memory. Alternatively use a keyword field instead."
}
]}
Dans ce cas, vous devez ajouter "MOT CLÉ" dans la demande, comme suit:
{
"aggs" : {
"langs" : {
"terms" : { "field" : "language.keyword",
"size" : 500 }
}
}}