2015-09-01 18 views
6

Ich kann Elasticsearch Aggregation + Filter nicht mit verschachtelten Feldern arbeiten. Das Datenschema (relevanter Teil) ist wie folgt:Elasticsearch-Aggregation funktioniert nicht mit verschachtelten Feldern

"mappings": { 
    "rb": { 
    "properties": { 
     "project": { 
     "type": "nested", 
     "properties": { 
      "age": { 
      "type": "long" 
      }, 
      "name": { 
      "type": "string", 
      "index": "not_analyzed" 
      } 
     } 
     }  
    } 
    } 
} 

Im Wesentlichen „rb“ Objekt enthält ein verschachteltes Feld „Projekt“, die zwei weitere Felder enthalten - „Namen“ und „Alter“. Ich Abfrage renne:

"aggs": { 
    "root": { 
    "aggs": { 
     "group": { 
     "aggs": { 
      "filtered": { 
      "aggs": { 
       "order": { 
       "percentiles": { 
        "field": "project.age", 
        "percents": ["50"] 
       } 
       } 
      }, 
      "filter": { 
       "range": { 
       "last_updated": { 
        "gte": "2015-01-01", 
        "lt": "2015-07-01" 
       } 
       } 
      } 
      } 
     }, 
     "terms": { 
      "field": "project.name", 
      "min_doc_count": 5, 
      "order": { 
      "filtered>order.50": "asc" 
      }, 
      "shard_size": 10, 
      "size": 10 
     } 
     } 
    }, 
    "nested": { 
     "path": "project" 
    } 
    } 
} 

Diese Abfrage soll Top-10-Projekte (project.name Feld), die die Datumsfilter entsprechen produzieren, durch ihr mittleres Alter sortierte, ignorieren Projekte mit weniger als 5 erwähnt in der Datenbank . Median sollte nur für Projekte berechnet werden, die dem Filter entsprechen (Datumsbereich).

Obwohl mehr als hunderttausend Objekte in der Datenbank vorhanden sind, erzeugt diese Abfrage eine leere Liste. Keine Fehler, nur leere Antwort. Ich habe es sowohl auf ES 1.6 als auch auf ES 2.0-beta ausprobiert.

Antwort

7

Ich habe Ihre Aggregationsabfrage etwas umorganisiert und konnte einige Ergebnisse anzeigen. Der Hauptpunkt ist Typ, da Sie um einen nested Typ aggregieren, nahm ich die filter Aggregation auf dem last_updated Feld heraus und verschoben es die Hierarchie als die erste Aggregation. Dann kommt die nested Aggregation auf dem project Feld und schließlich die terms und die percentile.

Das scheint ziemlich gut zu funktionieren. Bitte versuche.

{ 
    "size": 0, 
    "aggs": { 
    "filtered": { 
     "filter": { 
     "range": { 
      "last_updated": { 
      "gte": "2015-01-01", 
      "lt": "2015-07-01" 
      } 
     } 
     }, 
     "aggs": { 
     "root": { 
      "nested": { 
      "path": "project" 
      }, 
      "aggs": { 
      "group": { 
       "terms": { 
       "field": "project.name", 
       "min_doc_count": 5, 
       "shard_size": 10, 
       "order": { 
        "order.50": "asc" 
       }, 
       "size": 10 
       }, 
       "aggs": { 
       "order": { 
        "percentiles": { 
        "field": "project.age", 
        "percents": [ 
         "50" 
        ] 
        } 
       } 
       } 
      } 
      } 
     } 
     } 
    } 
    } 
} 
+0

Es funktioniert! Ich musste shard_size nur auf 100 erhöhen, um tatsächlich 10 Werte zurückzubekommen. Stört es Sie zu erklären, warum meine ursprüngliche Variante nicht funktioniert hat? Ist es in ES eine Einschränkung, dass Filter in verschachtelten Feldern nicht unterstützt werden? – extesy

+1

Innerhalb einer "geschachtelten" Aggregation können Sie nur verschachtelte Felder referenzieren. Außerdem ist es sinnvoller, Daten zuerst nach 'last_updated' zu filtern und erst dann mit den verschachtelten Daten zu arbeiten. – Val

+0

@Val - Können Sie mir bitte sagen, wie kann ich das für mehrwertige Eimer tun? Separate Frage - http://Stackoverflow.com/questions/43451667/elasticsearch-Ordering-aggregation-by-nested-aggregation-on-nested-field –

Verwandte Themen