it-swarm.com.de

ElasticSearch - Rückgabe eindeutiger Werte

Wie kann ich die Werte aller languages aus den Datensätzen abrufen und sie eindeutig machen?.

Records

PUT items/1
{ "language" : 10 }

PUT items/2
{ "language" : 11 }

PUT items/3
{ "language" : 10 }

Abfrage

GET items/_search
{ ... }

# => Expected Response
[10, 11]

Jede Hilfe wäre toll.

102
CharlesJHardy

Sie können die Termaggregation verwenden.

{
"size": 0,
"aggs" : {
    "langs" : {
        "terms" : { "field" : "language",  "size" : 500 }
    }
}}

Eine Suche wird ungefähr so ​​aussehen:

{
"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
       } ]
    }
  }
}

Der Parameter size innerhalb der Aggregation gibt die maximale Anzahl von Begriffen an, die in das Aggregationsergebnis einbezogen werden sollen. Wenn Sie alle Ergebnisse benötigen, setzen Sie diesen Wert auf einen Wert, der größer ist als die Anzahl der eindeutigen Begriffe in Ihren Daten.

140
Anton

Elasticsearch 1.1+ hat die Kardinalitätsaggregation, mit der Sie eine eindeutige Zählung erhalten

Beachten Sie, dass es sich tatsächlich um eine Annäherung handelt und die Genauigkeit bei Datasets mit hoher Kardinalität möglicherweise abnimmt, in meinen Tests jedoch im Allgemeinen ziemlich genau ist.

Sie können die Genauigkeit auch mit dem Parameter precision_threshold Einstellen. Der Kompromiss, oder natürlich, ist die Speichernutzung.

Diese Grafik aus den Dokumenten zeigt, wie ein höherer precision_threshold Zu viel genaueren Ergebnissen führt.


Relative error vs threshold

8
bradvido

Ich suche diese Art von Lösung auch für mich. Ich habe einen Verweis in Termaggregation gefunden.

Das Folgende ist also die richtige Lösung.

{
"aggs" : {
    "langs" : {
        "terms" : { "field" : "language",  
                    "size" : 500 }
    }
}}

Aber wenn Sie auf folgenden Fehler gestoßen sind:

"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."
            }
        ]}

In diesem Fall müssen Sie der Anfrage das Schlüsselwort " [~ # ~] [~ # ~] " wie folgt hinzufügen:

   {
    "aggs" : {
        "langs" : {
            "terms" : { "field" : "language.keyword",  
                        "size" : 500 }
        }
    }}
1
MAULIK MODI