Wie führe ich eine Pipeline-Aggregation durch, ohne alle Buckets in Elasticsearch zurückzugeben?

Ich verwende Elasticsearch 2.3 und versuche, eine zweistufige Berechnung mithilfe einer Pipeline-Aggregation durchzuführen. Ich bin nur am Endergebnis meiner Pipeline-Aggregation interessiert, aber Elasticsearch gibt alle Buckets-Informationen zurück.

Da ich eine große Anzahl von Eimern habe (Dutzende oder Hunderte von Millionen), ist dies unerschwinglich. Leider kann ich Es nicht anweisen, all diese Informationen nicht zurückzugeben.

Hier ist ein Spielzeugbeispiel. Ich habe einen Indextest-index mit einem Dokumenttypobj. obj hat zwei Felder,key undvalues.

curl -XPOST 'http://10.10.0.7:9200/test-index/obj' -d '{
  "value": 100,
  "key": "foo"
}'

curl -XPOST 'http://10.10.0.7:9200/test-index/obj' -d '{
  "value": 20,
  "key": "foo"
}'

curl -XPOST 'http://10.10.0.7:9200/test-index/obj' -d '{
  "value": 50,
  "key": "bar"
}'

curl -XPOST 'http://10.10.0.7:9200/test-index/obj' -d '{
  "value": 60,
  "key": "bar"
}'

curl -XPOST 'http://10.10.0.7:9200/test-index/obj' -d '{
  "value": 70,
  "key": "bar"
}'

Ich möchte den Durchschnittswert erhalten (über alleskeys) des Minimumsvalue vonobjs mit dem gleichenkeys. Durchschnitt der Minima.

Elasticsearch ermöglicht es mir, dies zu tun:

curl -XPOST 'http://10.10.0.7:9200/test-index/obj/_search' -d '{
  "size": 0,
  "query": {
    "match_all": {}
  },
  "aggregations": {
    "key_aggregates": {
      "terms": {
        "field": "key",
        "size": 0
      },
      "aggs": {
        "min_value": {
          "min": {
            "field": "value"
          }
        }
      }
    },
    "avg_min_value": {
      "avg_bucket": {
        "buckets_path": "key_aggregates>min_value"
      }
    }
  }
}'

Aber diese Abfrage gibt das Minimum für jeden Bucket zurück, obwohl ich es nicht brauche:

{
  "took": 21,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "failed": 0
  },
  "hits": {
    "total": 4,
    "max_score": 0,
    "hits": [

    ]
  },
  "aggregations": {
    "key_aggregates": {
      "doc_count_error_upper_bound": 0,
      "sum_other_doc_count": 0,
      "buckets": [
        {
          "key": "bar",
          "doc_count": 2,
          "min_value": {
            "value": 50
          }
        },
        {
          "key": "foo",
          "doc_count": 2,
          "min_value": {
            "value": 20
          }
        }
      ]
    },
    "avg_min_value": {
      "value": 35
    }
  }
}

Gibt es eine Möglichkeit, alle Informationen in @ loszuwerde"buckets": [...]? Ich interessiere mich nur füravg_min_value.

Dies scheint in diesem Spielzeugbeispiel kein Problem zu sein, aber wenn die Anzahl der verschiedenenkeys ist nicht groß (Dutzende oder Hunderte von Millionen), die Antwort auf die Abfrage ist unerschwinglich groß, und ich möchte es beschneiden.

Gibt es eine Möglichkeit, dies mit Elasticsearch zu tun? Oder modelliere ich meine Daten falsch?

NB: Es ist nicht akzeptabel, meine Daten pro Schlüssel vorab zu aggregieren, da dasmatch_all Ein Teil meiner Abfrage wird möglicherweise durch komplexe und unbekannte Filter ersetzt.

NB2: Ändern vonsize zu einer nicht negativen Zahl in meinemterms Aggregation ist nicht akzeptabel, da dies das Ergebnis verändern würde.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage