我想做一个过滤器聚合,嵌套聚合,然后是3个兄弟聚合。我已经测试了这个,它使用REST API。这是我使用的查询:
$("#buyers-report-modal").on('shown.bs.modal', function(e) {
var tab = e.relatedTarget.hash;
$('.nav-tabs a[href="'+tab+'"]').tab('show')
})
现在,我想在代码库中使用Java API实现此查询。我不确定如何进行兄弟聚合,因为{
"aggs": {
"filter_agg": {
"filter": {
...
},
"aggs": {
"nested_agg": {
"nested": {
"path": "myProperty"
},
"aggs": {
"sibling_agg_1": {
...
},
"sibling_agg_2": {
...
},
"sibling_agg_3": {
...
}
}
}
}
}
}
}
可用的唯一方法是FilterAggregationBuilder
。
在Java API的上下文中是这些兄弟聚合子聚合吗?
我开始编写的Java代码如下所示:
subAggregation()
然后我唯一可以继续做的就是构建client.prepareSearch(index)
.setTypes(types)
.setSearchType(SearchType.COUNT)
.addAggregation(myFilterAggregation
.subAggregation(AggregationBuilders.nested("nested_agg").path("myProperty"))
更多SearchRequestBuilder
- 这是实现这个的正确方法吗?在这种情况下,REST API和Java API似乎不同。
答案 0 :(得分:2)
您可以通过向nested
添加子聚合来执行此操作(请注意,我选择了terms
聚合,因为从查询DSL中无法清除具体的聚合类型你正在使用兄弟聚合):
// create the nested aggregation
NestedBuilder nestedAgg = AggregationBuilders.nested("nested_agg").path("myProperty");
// now add each of your sub-aggregation to it
nestedAgg.subAggregation(AggregationBuilders.terms("sibling_agg_1").field("field1"));
nestedAgg.subAggregation(AggregationBuilders.terms("sibling_agg_2").field("field2"));
nestedAgg.subAggregation(AggregationBuilders.terms("sibling_agg_3").field("field3"));
// finally add the nested aggregation to the filter aggregation
client.prepareSearch(index)
.setTypes(types)
.setSearchType(SearchType.COUNT)
.addAggregation(myFilterAggregation
.subAggregation(nestedAgg);