相关疑难解决方法(0)

Spring数据ElastiSearch带有过滤器的聚合

我正在尝试对某些条件筛选的值执行聚合.我正在使用Spring数据的ElasticSearchTemplate.query()方法执行查询并在结果提取器中获取结果.我正确地获得了命中(即应用过滤器并且仅检索与这些值匹配的文档.).但是,会对所有文档执行聚合.我认为聚合应该只应用于过滤值.以下是我使用的代码:

SearchQuery query = //get the query    
SearchResponse hits = template.query(query, new ResultsExtractor<SearchResponse>() {
                @Override
                public SearchResponse extract(SearchResponse response) {
                    return response;
                }
            });
Run Code Online (Sandbox Code Playgroud)

为了进一步调试问题,我编写了代码来执行查询而不是使用spring数据.以下是代码:

SearchRequestBuilder builder = esSetup.client().prepareSearch("document");
            builder.setQuery(QueryBuilders.filteredQuery(QueryBuilders.matchAllQuery(), query.getFilter()));

            builder.addFields(query.getFields().toArray(new String[query.getFields().size()]));
            for(AbstractAggregationBuilder aggregation : query.getAggregations()){
                builder.addAggregation(aggregation);
            }
            SearchResponse response = builder.get();
Run Code Online (Sandbox Code Playgroud)

令我惊讶的是,此查询正确执行,并且过滤器也应用于聚合.为了进一步分析,我浏览了elasticsearchtemplate的代码,发现它使用setPostFilter方法来设置过滤器.然后,我修改了我的代码,以此方式设置过滤器:

SearchRequestBuilder builder = esSetup.client().prepareSearch("document");
//          builder.setQuery(QueryBuilders.filteredQuery(QueryBuilders.matchAllQuery(), query.getFilter()));
            builder.setPostFilter(query.getFilter());
            builder.addFields(query.getFields().toArray(new String[query.getFields().size()]));
            for(AbstractAggregationBuilder aggregation : query.getAggregations()){
                builder.addAggregation(aggregation);
            }
            SearchResponse response = builder.get();
Run Code Online (Sandbox Code Playgroud)

当我执行上面的代码时,它表现出与spring数据相同的行为!(即过滤器应用于查询但不应用于聚合.这是弹簧数据的错误吗?如果没有,那么,是否还有其他方法可以按照我想要的方式检索数据?

提前致谢.

java spring elasticsearch spring-data-elasticsearch

1
推荐指数
1
解决办法
4719
查看次数