2017-05-12 7 views
1

Ich versuche leere Eimer in einem Filter Aggregation Block zu filtern, und ich bekomme einen Fehler von elasticsearch. ohne dies ist die Antwort groß, da ich viele metrische bin Abfragen und verschachtelte Aggregation (dies ist Teil der größeren Abfrage der Einfachheit halber)bucket_script innerhalb Filteraggregation wirft Fehler

GET index/type/_search?ignore_unavailable 
{ 
    "size": 0, 
    "aggs": { 
    "groupby_country": { 
     "terms": { 
     "field": "country", 
     "size": 2000 
     }, 
     "aggs": { 
     "exists__x__filter": { 
      "filter": { 
      "bool": { 
       "filter": [ 
       { 
        "exists": { 
        "field": "x" 
        } 
       } 
       ] 
      } 
      }, 
      "aggs": { 
      "sum": { 
       "sum": { 
       "script": "def val = doc['x'].value; if(val>0) Math.min(val , 20000)" 
       } 
      }, 
      "average_distinct": { 
       "bucket_script": { 
       "buckets_path": { 
        "count": "_count" 
       }, 
       "script": "return params.count " 
       } 
      } 
      } 
     } 
     } 
    } 
    } 
} 

elastische Reaktion:

{ 
    "error": { 
    "root_cause": [], 
    "type": "reduce_search_phase_exception", 
    "reason": "[reduce] ", 
    "phase": "fetch", 
    "grouped": true, 
    "failed_shards": [], 
    "caused_by": { 
     "type": "class_cast_exception", 
     "reason": "org.elasticsearch.search.aggregations.bucket.filter.InternalFilter cannot be cast to org.elasticsearch.search.aggregations.InternalMultiBucketAggregation" 
    } 
    }, 
    "status": 503 
} 

was ich versuche, zu tun ist: wenn für einen geben Land Eimer, gibt es kein Feld x (ich zum Beispiel Land UK - 2 Dokumente hat nicht das "x" Feld) nicht den Land Eimer zum Client zurückgeben.

+0

Ich verstehe nicht, was Sie mit dem 'bucket_script' ... –

+0

@ AndreiStefan- tun wollen Ich habe eine Klarstellung hinzugefügt (bitte sagen Sie mir, wenn es noch unklar ist) –

Antwort

0

Sie benötigen einen bucket_selector für das und das Skript etwas andere aaand auf ein höheres Niveau gebracht:

{ 
    "size": 0, 
    "aggs": { 
    "groupby_country": { 
     "terms": { 
     "field": "country", 
     "size": 2000 
     }, 
     "aggs": { 
     "exists__x__filter": { 
      "filter": { 
      "bool": { 
       "filter": [ 
       { 
        "exists": { 
        "field": "x" 
        } 
       } 
       ] 
      } 
      }, 
      "aggs": { 
      "sum": { 
       "sum": { 
       "script": "def val = doc['x'].value; if(val>0) Math.min(val , 20000)" 
       } 
      } 
      } 
     }, 
     "average_distinct": { 
      "bucket_selector": { 
      "buckets_path": { 
       "count": "exists__x__filter._count" 
      }, 
      "script": "params.count > 0" 
      } 
     } 
     } 
    } 
    } 
} 
+0

vielen Dank. Du hast mir ein paar Stunden gerettet ... –

+0

Hehe, kein Problem :-). –