1

Я пишу api используя данные весны elasticsearch, и я хочу добавить order.I не могу найти решение в google. Поэтому я пишу здесь, чтобы спросить вас, как я могу это сделать. Если вам понадобится больше кода, скажите мне, что вам нужно, и я пытаюсь добавить еще код.Как добавить сортировку к данным весны elasticsearch

Мой код выглядит следующим образом:

AuctionQueryController.java

@RequestMapping(value = "/auctions/search", produces = MediaType.APPLICATION_JSON_VALUE) 
    private List<Auction> search(
      @RequestParam(value = "categoryId", required = false) Long categoryId, 
      @RequestParam(value = "treeCategoryId", required = false) Long treeCategoryId, 
      @RequestParam(value = "currency", required = false) String currency, 
      @RequestParam(value = "priceFrom", required = false) Long priceFrom, 
      @RequestParam(value = "priceTo", required = false) Long priceTo, 
      @RequestParam(value = "startDateFrom", required = false) Long startDateFrom, 
      @RequestParam(value = "startDateTo", required = false) Long startDateTo, 
      @RequestParam(value = "endDateFrom", required = false) Long endDateFrom, 
      @RequestParam(value = "endDateTo", required = false) Long endDateTo, 
      @RequestParam(value = "title", required = false) String title, 
      @RequestParam(value = "uid", required = false) Long uid, 
      Pageable pageable) { 

     final AuctionIndexSearchParams searchParams = AuctionIndexSearchParams.builder() 
       .categoryId(categoryId) 
       .treeCategoryId(treeCategoryId) 
       .currency(currency) 
       .priceFrom(priceFrom) 
       .priceTo(priceTo) 
       .startDateFrom(startDateFrom) 
       .startDateTo(startDateTo) 
       .endDateFrom(endDateFrom) 
       .endDateTo(endDateTo) 
       .title(title) 
       .uid(uid) 
       .build(); 

     return auctionService.searchByIndexParams(searchParams, pageable); 
    } 

AuctionService.java

public List<Auction> searchByIndexParams(AuctionIndexSearchParams searchParams, Pageable pageable) { 
     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)))); 

     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.withPageable(pageable); 
     searchQuery.withQuery(boolQueryBuilder); 
     FilterBuilder[] filterArr = new FilterBuilder[filters.size()]; 
     filterArr = filters.toArray(filterArr); 
     searchQuery.withFilter(andFilter(filterArr)); 

     final FacetedPage<AuctionIndex> search = auctionIndexRepository.search(searchQuery.build()); 

     return search.map(index -> 
         auctionRepository.findAuctionById(Long.valueOf(index.getId())) 
     ).getContent(); 
    } 

ответ

2

Вы можете использовать SortBuilders для этого.

 searchQuery.withSort(SortBuilders.fieldSort("fieldName").order(SortOrder.DESC)) 

Это будет сортировать ваш результат на основе fieldName.

Надеюсь, это поможет

+0

Хорошо и как добавить в этот порядок? – rad11

+0

Отредактировано согласно вашему требованию – Richa