2017-02-20 3 views
1

Ich habe Probleme mit verschachtelten Aggregationen. Hier ist, wie ich meine Aggregationen definieren und die json Äquivalent ich:Verschachtelte Aggregation funktioniert nicht mit AggregationContainer

var aggregations = new AggregationDictionary(); 

var nestedAgg = new AggregationContainer 
{ 
    Nested = new NestedAggregation("some_name1") 
    { 
    Path = "users", 
    Aggregations = new TermsAggregation("some_name2") 
    { 
     Field = "users.name.keyword", 
     Size = 100, 
     Order = new List<TermsOrder> { new TermsOrder() { Key = "_term", Order = SortOrder.Descending } } 
    } 
}; 

aggregations[aggKey] = nestedAgg; 

searchRequest.Aggregations = aggregations; 

Die oben an folgende json übersetzt. es zeigt nur den Pfad und keine Aggregationen Definition:

{ 
    "aggs": { 
    "some_name1": { 
     "nested": { 
      "path": "users" 
      } 
    } 
} 

Antwort

0

Mit AggregationDictionary und AggregationContainer direkt ein wenig umständlich ist; Sie können wie diese

var aggregations = new AggregationDictionary(); 
var aggKey = "some_name1"; 

AggregationContainer nestedAgg = new NestedAggregation("some_name1") 
{ 
    Path = "users", 
    Aggregations = new TermsAggregation("some_name2") 
    { 
     Field = "users.name.keyword", 
     Size = 100, 
     Order = new List<TermsOrder> 
     { 
      new TermsOrder() { Key = "_term", Order = Nest.SortOrder.Descending } 
     } 
    } 
}; 

aggregations[aggKey] = nestedAgg; 

var searchRequest = new SearchRequest<Test>(); 

searchRequest.Aggregations = aggregations; 

client.Search<Test>(searchRequest); 

so tun Hier wir die implizite Konvertierung von AggregationBase (die Basisklasse, die Aggregationen von herleiten) verwenden, um AggregationContainerAggregationContainer ein NestedAggregation auf eine Variable vom Typ zuzuordnen.

This implicit conversion also sets the Aggregations and Meta properties on AggregationContainer, which is why your original attempt doesn't quote work correctly.

+0

warum wird mit 'AggregationDictionary' und' AggregationContainer' direkt umständlich? Wie füge ich mehrere Aggregationen zu meinem 'SearchRequest' hinzu? –

+0

Die Verwendung von direkt ist ein wenig _awkward_ aus ein paar Gründen :) Jeder Aggregationstyp hat einen Konstruktor, der einen Namen (wie es erforderlich ist) nimmt, aber mit 'AggregationDictionary' wird der Name des Schlüssels der Name für die Aggregation verwendet. Wenn Sie 'AggregationContainer' direkt verwenden, müssen Sie sicherstellen, dass Sie beim Zuweisen einer Aggregation auch die Eigenschaften 'Aggregations' und' Meta' entsprechend der Antwort festlegen. Um es einfacher zu machen, gibt es implizite Konvertierungen von 'AggregationBase' in' AggregationContainer' und 'AggregationDictionary'. –

+0

Sie können Aggregationen mit '&&' kombinieren: https://www.elastic.co/guide/en/elasticsearch/client/net-api/current/writing-aggregations.html –

Verwandte Themen