elasticsearch: возврат TotalPages неверен

У меня есть 107 документов в моей индексной базе, я создал метод для возврата всех этих документов с нумерацией страниц, в моем случае первая страница содержит 20 документов, и я логически получаю 6 страниц, 5 первых страниц содержат 20 документов каждая, а 6-я страница содержит только 7. Проблема в том, что методы возвращают всегда 1 страницу, а не 6

  @Override
  @Transactional(readOnly = true)
  public Page<Convention> findAll(Pageable pageable) throws UnknownHostException {
    String[] parts = pageable.getSort().toString().split(":");
    SortOrder sortOrder;
    if ("DESC".equalsIgnoreCase(parts[1].trim())) {
      sortOrder = SortOrder.DESC;
    } else {
      sortOrder = SortOrder.ASC;
    }
    SearchResponse searchResponse = elasticsearchConfiguration.getTransportClient()
     .prepareSearch("convention")
     .setTypes("convention")
     .setQuery(QueryBuilders.matchAllQuery())
     .addSort(SortBuilders.fieldSort(parts[0])
     .order(sortOrder))
     .setSize(pageable.getPageSize())
     .setFrom(pageable.getPageNumber() * pageable.getPageSize())
     .setSearchType(SearchType.QUERY_THEN_FETCH)
     .get();

    return searchResults(searchResponse);
  }

  private Page<Convention> searchResults(SearchResponse searchResponse) {
    List<Convention> conventions = new ArrayList<>();
    for (SearchHit hit : searchResponse.getHits()) {
      if (searchResponse.getHits().getHits().length <= 0) {
        return null;
      }
      String sourceAsString = hit.getSourceAsString();
      if (sourceAsString != null) {
        ObjectMapper mapper = new ObjectMapper();
        Convention convention = null;
        try {
          convention = mapper.readValue(sourceAsString, Convention.class);
        } catch (IOException e) {
          LOGGER.error("Error", e);
        }
        conventions.add(convention);
      }
    }
    return new PageImpl<>(conventions);
  }

http://localhost:8081/api/conventions?page=0&size=20&sort=shortname,DESC

Когда я запускаю этот API, у меня есть TotalElements=20, Number=0, TotalPages=1 и Size=0.

@GetMapping("/conventions")
  public ResponseEntity<List<Convention>> getAllConventions(final Pageable pageable) throws UnknownHostException {
    final Page<Convention> page = conventionService.findAll(pageable);
    System.out.println("-------------- 1:" + page.getTotalElements()); // 20
    System.out.println("-------------- 2:" + page.getNumber()); // 0
    System.out.println("-------------- 3:" + page.getTotalPages()); // 1
    System.out.println("-------------- 4:" + page.getSize()); // 0
    HttpHeaders headers = new HttpHeaders();
    headers.add("X-Total-Count", Long.toString(page.getTotalElements()));
    return new ResponseEntity<>(page.getContent(), headers, HttpStatus.OK);
  }

person Aymen Kanzari    schedule 18.04.2018    source источник


Ответы (2)


Эта проблема решена и исправлена ​​в текущей стабильной версии spring-data-elasticsearch 3.0.7.

См. https://jira.spring.io/browse/DATAES-402.

person xhaggi    schedule 09.05.2018
comment
Я не использую эластичный поиск данных spring, но я использовал java API Elasticsearch - person Aymen Kanzari; 19.05.2018

я думаю, что это происходит из этой строки: return new PageImpl<>(conventions);

Возможно вам стоит передать общий размер респоншитов, потому что вы переопределяете запрос.

person 吴晓宇    schedule 02.07.2019