ElasticSearch-.NET NEST API通过对象初始化构建多个聚合API似乎创建了一个不正确的请求



我正在动态构建弹性搜索查询的组件,该查询可能包含多个聚合。

.Net 4.5.2 Nest 2.3.1 Elasticsearch.Net 2.3.1

我可以通过重复以下结构成功添加多个聚合:

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

然后将搜索中的aggregations属性设置为aggregations变量。一切都很好。

我可以成功地创建一个嵌套的聚合,如下所示:

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

再次将搜索中的aggregations属性设置为aggregations变量,一切都很好。

当我将这两种方法结合起来创建一个具有多个聚合的查询时,问题就来了,其中一个(或多个)是嵌套的。因此,上面嵌套示例生成的Json看起来像:

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

现在,当我将这些方法组合在一起,以便像第一个代码片段中那样添加嵌套聚合时:

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
};

然后生成的查询的Json会错过实际的"国家"汇总:

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

那么,这是一个错误,还是我错误地使用了Nest类?如果我错误地使用了这些类,我该如何修复代码?

谢谢你的帮助。

解决问题的方法是将NestedAgregation的显式强制转换添加到AggregationContainer中,然后直接将其添加到聚合字典中。

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;

最新更新