1

Ich möchte Daten mit Federdaten elasticsearch aggregieren. Ich möchte Aggregat sum(price), sum(qty). Was sollte ich zur Methode .addAggregation hinzufügen, um dieses spezifische Ergebnis zu erhalten und wie man es bekommt?Federdaten Elasticsearch Aggregat Summe - Preis, Menge

"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" } 
        } 

Mein Service-Methode wie folgt aussehen:

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

Warum Aggregation nicht zu aggregieren Filter bekommen, Bool usw. und das Rück aggs ich für alle Datensätze thnik?

Antwort

0

Verwenden Sie diese Aggregation addieren und die Ergebnisse holen:

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 aber wie implementiert es im Frühjahr data elasticsearch? Look @up – rad11

+0

Dies ist eine Kombination aus Frühjahr Daten ES und Java Api .. Ich denke, das sollte funktionieren – Richa

+0

Es funktioniert nicht am Start, wenn versuchen zu Objekt .client searchTemplate nicht ich habe @Autowired private ElasticsearchTemplate searchTemplate; also funktioniert dein Beispiel nicht für mich und das, was ich hinzufüge, gib mir die Summe des Indexes zurück. – rad11

2

Ich weiß, dass es zu spät ist, aber für Spring Data Elasticsearch Code aus früheren Antwort würde wie folgt aussehen:

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

Sie vergessen, build() am Ende des NativeSearchQueryBuilder aufzurufen. Es schlägt anders. –

+0

Sie sind völlig richtig. Vielen Dank! Aktualisierter Beitrag mit deinen Ergebnissen. –