如何使用Elasticsearch Java API构建兄弟聚合?

时间:2015-10-12 15:44:02

标签: java elasticsearch

我想做一个过滤器聚合,嵌套聚合,然后是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似乎不同。

1 个答案:

答案 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);