java - spring data elasticsearch聚合总和——价格、数量

标签 java elasticsearch spring-boot spring-data spring-data-elasticsearch

我想使用 spring data elasticsearch 聚合数据。我想要汇总 sum(price) , sum(qty)。我应该向方法 .addAggregation 添加什么以获得该特定结果以及如何获得它?

"properties": {
                        "cat": { "store": true,  "type": "long" }, 
                        "curr": { "index": "not_analyzed",  "store": true,  "type": "string" }, 
                        "end_date": { "store": true,  "type": "long" }, 
                        "price": { "store": true,  "type": "long" }, 
                        "start_date": { "store": true,  "type": "long" }, 
                        "tcat": { "store": true,  "type": "long" }, 
                        "title": { "store": true,  "type": "string" }, 
                        "uid": { "store": true,  "type": "long" }
                    }

我的服务方法如下:

final List<FilterBuilder> filters = Lists.newArrayList();
        final NativeSearchQueryBuilder searchQuery = new NativeSearchQueryBuilder().withQuery(matchAllQuery());
        Optional.ofNullable(searchParams.getCategoryId()).ifPresent(v -> filters.add(boolFilter().must(termFilter("cat", v))));
        Optional.ofNullable(searchParams.getCurrency()).ifPresent(v -> filters.add(boolFilter().must(termFilter("curr", v))));
        Optional.ofNullable(searchParams.getTreeCategoryId()).ifPresent(v -> filters.add(boolFilter().must(termFilter("tcat", v))));
        Optional.ofNullable(searchParams.getUid()).ifPresent(v -> filters.add(boolFilter().must(termFilter("uid", v))));

        //access for many uids
        if (searchParams.getUids() != null) {
            Optional.ofNullable(searchParams.getUids().split(",")).ifPresent(v -> {
                filters.add(boolFilter().must(termsFilter("uid", v)));
            });
        }

        //access for many categories
        if (searchParams.getCategories() != null) {
            Optional.ofNullable(searchParams.getCategories().split(",")).ifPresent(v -> {
                filters.add(boolFilter().must(termsFilter("cat", v)));
            });
        }

        final BoolQueryBuilder boolQueryBuilder = new BoolQueryBuilder();

        if (Optional.ofNullable(searchParams.getTitle()).isPresent()) {
            boolQueryBuilder.should(queryStringQuery(searchParams.getTitle()).analyzeWildcard(true).field("title"));
        }

        if (Optional.ofNullable(searchParams.getStartDateFrom()).isPresent()
                || Optional.ofNullable(searchParams.getStartDateTo()).isPresent()) {
            filters.add(rangeFilter("start_date").from(searchParams.getStartDateFrom()).to(searchParams.getStartDateTo()));
        }

        if (Optional.ofNullable(searchParams.getEndDateFrom()).isPresent()
                || Optional.ofNullable(searchParams.getEndDateTo()).isPresent()) {
            filters.add(rangeFilter("end_date").from(searchParams.getEndDateFrom()).to(searchParams.getEndDateTo()));
        }

        if (Optional.ofNullable(searchParams.getPriceFrom()).isPresent()
                || Optional.ofNullable(searchParams.getPriceTo()).isPresent()) {
            filters.add(rangeFilter("price").from(searchParams.getPriceFrom()).to(searchParams.getPriceTo()));
        }



    searchQuery.withQuery(boolQueryBuilder);

            FilterBuilder[] filterArr = new FilterBuilder[filters.size()];
            filterArr = filters.toArray(filterArr);
            searchQuery.withFilter(andFilter(filterArr));
searchQuery.addAggregation(AggregationBuilders("price").field("price"));
        Aggregations aggregations = searchTemplate.query(searchQuery.build(), new ResultsExtractor<Aggregations>(){
        @Override
            public Aggregations extract(SearchResponse response) {
                return response.getAggregations();
            }
        });
        return aggreg

ations.asMap();

为什么聚合不能聚合过滤器、bool 等并返回所有记录的聚合?

最佳答案

我知道为时已晚,但对于 Spring Data Elasticsearch,之前答案中的代码将如下所示:

SearchQuery searchQuery = new NativeSearchQueryBuilder()
        .withIndices("index_name")
        .withTypes("type_name")
        .withQuery(searchQuery)
        .addAggregation(AggregationBuilders.sum("sum_of_price").field("price"))
        .addAggregation(AggregationBuilders.sum("sum_of_qty").field("qty")).build();

Aggregations aggregations = elasticsearchTemplate.query(searchQuery, new ResultsExtractor<Aggregations>() {
  @Override
  public Aggregations extract(SearchResponse response) {
    return response.getAggregations();
  }
});

Sum aggregation = aggregations.get("sum_of_price");
double priceTotal = aggregation.getValue());

关于java - spring data elasticsearch聚合总和——价格、数量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36737259/

相关文章:

ruby-on-rails - 使用ElasticSearch和Tire按嵌套元素的数量排序

带有 Spring Boot 执行器和 Tomcat 的 java.lang.StackOverflowError

java - 具有不同队列的 Spring AMQP 监听器

java - 如何在 onPerformSync 中实现 Yelp Api

java - 如何获取玩家正在查看的方 block 的坐标?

Java、Spark,返回index.html

java - HTTP 请求正文中的数据如何传递到 servlet

java - 用于测试数组元素是否与某些索引相等的递归

elasticsearch - 在Elasticsearch中按列表排序

elasticsearch - ElasticSearch/Painless:如何在迭代时跳过项目?