1

私はスプリングデータelasticsearchを使用してデータを集計したいと思います。私は総計sum(price)sum(qty)が欲しいです。特定の結果を得るために、方法.addAggregationにどのような情報を追加すればいいのですか?スプリングデータelasticsearch集計合計価格、数量

"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(); 

なぜ集約ブール値など、集計フィルタを取得し、私はすべてのレコードに対してthnik aggsを返しませんか?

答えて

0

これを使用して集計を追加し、結果を取得します

SearchRequestBuilder searchRequestBuilder = elasticsearchTemplate.client.prepareSearch("index_name") 
      .setIndices("index_name") 
      .setTypes("type_name").setQuery(searchQuery).addAggregation(AggregationBuilders.stats("sum_of_price").field("price")) 
      .addAggregation(AggregationBuilders.sum("sum_of_qty").field("qty")) 
    SearchResponse searchResponse = searchRequestBuilder.execute().actionGet() 
    Integer priceTotal = (searchResponse.getAggregations().getAsMap().get("sum_of_price").getSum()) 
+0

[OK]をどのように春のデータelasticsearchでそれを実装するのですか? Look Up @up – rad11

+0

これは春のデータESとJavaのApiの組み合わせです。これはうまくいくはずです – Richa

+0

オブジェクトを取得しようとすると起動しません.client searchTemplateを持っていません。@Autowiredを取得しました。 private ElasticsearchTemplate searchTemplate;あなたの例は私のために働いていないと私が追加するものは、インデックスのすべての合計を返します – rad11

2

私は手遅れになることを知っているが、前の回答から春データ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()); 
+1

NativeSearchQueryBuilderの最後にbuild()を呼び出すことを忘れてしまいました。それ以外の場合は失敗します。 –

+0

あなたはまったく正しいです。ありがとうございました!あなたの調査結果とともに投稿が更新されました。 –

関連する問題