web-dev-qa-db-fra.com

ElasticSearch - Renvoyer des valeurs uniques

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.

102
CharlesJHardy

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.

140
Anton

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.


Relative error vs threshold

8
bradvido

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 }
        }
    }}
1
MAULIK MODI