1

Я хотел бы объединить данные, используя весенние данные elasticsearch. Я хочу заполнить sum(price), sum(qty). Что я должен добавить к методу .addAggregation, чтобы получить этот конкретный результат и как его получить?Весенние данные elasticsearch aggregate sum - цена, количество

"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 и т.д., и вернуть Aggs я thnik для всех записей?

ответ

0

Используйте это, чтобы добавить Aggregation и принести результаты:

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 – rad11

+0

Это комбинация весенних данных ES и Java Api .. Я думаю, что это должно работать – Richa

+0

Это не работает при запуске, когда пытаюсь получить объект .client searchTemplate, не имея его I'v получил @Autowired private ElasticsearchTemplate searchTemplate; так что ваш пример не работает для меня и что то, что я добавляю, возвращает мне всю сумму индекса – rad11

2

Я знаю, что это слишком поздно, но для 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()); 
+1

Вы забыли вызвать build() в конце NativeSearchQueryBuilder. Это не так. –

+0

Вы совершенно правы. Спасибо! Обновлено сообщение с вашими выводами. –

 Смежные вопросы

  • Нет связанных вопросов^_^