elasticsearch:返回的TotalPages不正确 [英] elasticsearch: return TotalPages not correct

查看:475
本文介绍了elasticsearch:返回的TotalPages不正确的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我的索引库中有107个文档,我创建了一种以分页方式返回所有这些文档的方法,在我的情况下,第一页包含20个文档,而我在逻辑上得到6页,前5个首页分别包含20个文档,并且第6页仅包含7页.问题在于方法总是返回1页而不是6

I have 107 documents in my index base, i created a method to return all these documents with pagination, in my case the first page contains 20 documents and i logically get 6 pages, the 5 first pages contain 20 documents each and the 6th page contains only 7. The problem is that the methods reeturn always 1 page not 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

When i execute this api, i have TotalElements=20, Number=0, TotalPages=1, and 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);
  }

推荐答案

此问题已在spring-data-elasticsearch 3.0.7的当前稳定版本中得到解决并得以解决

This issue is addressed and fixed in current stable version of spring-data-elasticsearch 3.0.7

请参见 https://jira.spring.io/browse/DATAES-402

这篇关于elasticsearch:返回的TotalPages不正确的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆