我正在动态构建弹性搜索查询的组件,该查询可能包含多个聚合。
.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;