2016-04-24 14 views
3

Ich möchte die folgende SQL-Abfrage in Elasticsearch eins konvertieren. kann irgendjemand dabei helfen.Konvertieren der SQL-Abfrage in ElasticSearch-Abfrage

select csgg, sum(amount) from table1 
where type in ('a','b','c') and year=2016 and fc="33" group by csgg having sum(amount)=0 

Ich habe versucht, folgendermaßen: enter code here

{ 
    "size": 500, 
    "query" : { 
     "constant_score" : { 
     "filter" : { 
      "bool" : { 
       "must" : [ 
       {"term" : {"fc" : "33"}}, 
       {"term" : {"year" : 2016}} 
       ], 
       "should" : [ 
       {"terms" : {"type" : ["a","b","c"] }} 
       ] 
      } 
     } 
     } 
    }, 
    "aggs": { 
    "group_by_csgg": { 
     "terms": { 
     "field": "csgg" 
     }, 
     "aggs": { 
     "sum_amount": { 
      "sum": { 
      "field": "amount" 
      } 
     } 
     } 
    } 
    } 
} 

aber nicht sicher, ob ich recht tue als nicht die Ergebnisse zu validieren. scheint Abfrage innerhalb der Aggregation hinzugefügt werden.

Antwort

2

Angenommen, Sie verwenden Elasticsearch 2.x, gibt es eine Möglichkeit, die -semantics in Elasticsearch zu haben. Mir ist keine Möglichkeit vor 2.0 bekannt.

Sie können die neue Pipeline Aggregation verwenden Bucket Selector Aggregation, die nur die Eimer auswählt, die eine bestimmte Kriterien erfüllen:

POST test/test/_search 
{ 
    "size": 0, 
    "query" : { 
     "constant_score" : { 
     "filter" : { 
      "bool" : { 
       "must" : [ 
       {"term" : {"fc" : "33"}}, 
       {"term" : {"year" : 2016}}, 
       {"terms" : {"type" : ["a","b","c"] }} 
       ] 
      } 
     } 
     } 
    }, 
    "aggs": { 
    "group_by_csgg": { 
     "terms": { 
     "field": "csgg", 
     "size": 100 
     }, 
     "aggs": { 
     "sum_amount": { 
      "sum": { 
      "field": "amount" 
      } 
     }, 
     "no_amount_filter": { 
      "bucket_selector": { 
      "buckets_path": {"sumAmount": "sum_amount"}, 
      "script": "sumAmount == 0" 
      } 
     } 
     } 
    } 
    } 
} 

Allerdings gibt es zwei Vorbehalte.

script.aggs: true 
script.groovy: true 

Außerdem ist, wie es auf der Mutter Eimer arbeitet, ist es nicht garantiert, dass Sie alle Eimer mit Menge bekommen = 0. Wenn die Begriffe Aggregation nur wählt: Je nach Konfiguration kann es zu enable scripting wie das notwendig sein, Bedingungen mit Summenbetrag! = 0, haben Sie kein Ergebnis. script.aggs:: true script.groovy:

+0

, welche Aktion für folgende genommen wahr Er sagt auch, wie folgende: Fehler Parse [konnte nicht Aggregator Typ [bucket_selector] in [no_amount_filter] finden]]; }] – fasterslow2007

+1

Verwenden Sie Elasticsearch Version> = 2.0.0? Für mich klingt es so, als ob du eine 1.x-Version benutzt. –

Verwandte Themen