2016-05-11 6 views
0

Ich bin der Aufbau der Komponenten einer elastischen Suchabfrage dynamisch, die Abfrage enthält möglicherweise mehrere Aggregationen.ElasticSearch - .NET NEST API erstellen mehrere Aggregationen mit Objektinitialisierung API scheint eine falsche Anfrage erstellen

.Net 4.5.2 Nest 2.3.1 Elasticsearch.Net 2.3.1

I durch Wiederholen der folgenden Struktur mehrere Aggregationen erfolgreich hinzufügen können:

var aggregations = new AggregationDictionary(); 
aggregations["yyy"] = new AggregationContainer { 
    Terms = new TermsAggregation("xxx") 
    { 
     Field = "afield" 
    } 
}; 

und dann wird die Aggregrations-Eigenschaft auf die Suche nach der Aggregationsvariablen. Und alles ist gut.

kann ich erfolgreich eine einzelne verschachtelte Aggregation wie folgt:

var aggregations=new NestedAggregation("Countries") { 
    Path = "MetaData.GeographicCoverage.Countries", 
    Aggregations = 
     new TermsAggregation("Country") { 
     Field = "MetaData.GeographicCoverage.Countries.Country" 
     } 
}; 

Und wieder die Aggregrations Eigenschaft auf die Aggregationen auf der Suche Einstellgröße und alles ist gut.

Das Problem kommt, wenn ich die beiden Ansätze kombinieren, um eine Abfrage mit vielen Aggregationen zu erstellen, von denen eine (oder mehrere) verschachtelt ist. So ist die Json durch das oben verschachtelte Beispiel erzeugte wie folgt aussieht:

{ 
    "size": 0, 
    "aggs": { 
    "Countries": { 
     "nested": { 
      "path": "MetaData.GeographicCoverage.Countries" 
     }, 
     "aggs": { 
     "Country": { 
      "terms": { 
      "field": "MetaData.GeographicCoverage.Countries.Country" 
      } 
     } 
     } 
    } 
    } 
} 

Nun, wenn ich die Ansätze kombinieren, so dass die verschachtelte Aggregation hinzugefügt wird, ebenso wie die in dem ersten Code-Schnipsel:

var aggregations = new AggregationDictionary(); 

var nested = new NestedAggregation("Countries") { 
    Path = "MetaData.GeographicCoverage.Countries", 
    Aggregations = 
     new TermsAggregation("Country") { 
     Field = "MetaData.GeographicCoverage.Countries.Country" 
     } 
    }; 

aggregations["Countries"] = new AggregationContainer { 
    Nested = nested 
}; 

Dann die Json der Abfrage, die vermisst die eigentliche „Country“ Aggregation erzeugt wird:

{ 
    "size": 0, 
    "aggs": { 
    "Countries": { 
     "nested": { 
     "path": "MetaData.GeographicCoverage.Countries" 
     } 
    } 
    } 
} 

Also dann - ist das ein Bug oder verwende ich die Nest Klassen falsch? Wenn ich die Klassen falsch verwende, wie repariere ich den Code?

Danke für jede Hilfe.

Antwort

0

Das Problem besteht darin, eine explizite Umwandlung der NestedAggregation in einen AggregationContainer hinzuzufügen und sie dann direkt dem AggregationsDictionary hinzuzufügen.

var aggregations = new AggregationDictionary(); 
var nested = 
    new NestedAggregation("Countries") { 
     Path = "MetaData.GeographicCoverage.Countries", 
     Aggregations = 
     new TermsAggregation("Country") { 
      Field = "MetaData.GeographicCoverage.Countries.Country" 
     } 
     }; 

aggregations["Countries"] = (AggregationContainer)nested;