解决使用 Spring Boot 集成 Elasticsearch 实现分页查询 getTotalPages() 返回值始终为1的问题

问题描述

  • 测试代码
    @Test
    public void customAdvanceSelect() {
        // 构造查询条件
        NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder();
        // 添加基本的分词条件
        queryBuilder.withQuery(QueryBuilders.matchQuery("title", "你的文档"));
        // 排序条件(降序)
        queryBuilder.withSort(SortBuilders.fieldSort("id").order(SortOrder.ASC));
        // 分页条件
        queryBuilder.withPageable(PageRequest.of(0, 15));
        // 根据条件查询
        Page<Article> articlesESEntities = articleRepositories.search(queryBuilder.build());

        logger.info("【文章】总条数 = {}", articlesESEntities.getTotalElements());
        logger.info("【文章】总页数 = {}", articlesESEntities.getTotalPages());
        articlesESEntities.forEach(article -> logger.info("【文章】= {}", JSON.toJSONString(article)));
    }
  • 结果
    2020-06-12 10:14:16.217  INFO 14604 --- [           main] c.e.t.e.SpringDataElasticSearchTest      : 【文章】总条数 = 99
    2020-06-12 10:14:16.218  INFO 14604 --- [           main] c.e.t.e.SpringDataElasticSearchTest      : 【文章】总页数 = 1
    2020-06-12 10:14:16.385  INFO 14604 --- [           main] c.e.t.e.SpringDataElasticSearchTest      : 【文章】= {"content":"新添加的文档内容1","id":1,"title":"新添加的文档1"}
    2020-06-12 10:14:16.386  INFO 14604 --- [           main] c.e.t.e.SpringDataElasticSearchTest      : 【文章】= {"content":"新添加的文档内容2","id":2,"title":"新添加的文档2"}
    2020-06-12 10:14:16.387  INFO 14604 --- [           main] c.e.t.e.SpringDataElasticSearchTest      : 【文章】= {"content":"新添加的文档内容3","id":3,"title":"新添加的文档3"}
    2020-06-12 10:14:16.387  INFO 14604 --- [           main] c.e.t.e.SpringDataElasticSearchTest      : 【文章】= {"content":"新添加的文档内容4","id":4,"title":"新添加的文档4"}
    2020-06-12 10:14:16.387  INFO 14604 --- [           main] c.e.t.e.SpringDataElasticSearchTest      : 【文章】= {"content":"新添加的文档内容5","id":5,"title":"新添加的文档5"}
    2020-06-12 10:14:16.388  INFO 14604 --- [           main] c.e.t.e.SpringDataElasticSearchTest      : 【文章】= {"content":"新添加的文档内容6","id":6,"title":"新添加的文档6"}
    2020-06-12 10:14:16.388  INFO 14604 --- [           main] c.e.t.e.SpringDataElasticSearchTest      : 【文章】= {"content":"新添加的文档内容7","id":7,"title":"新添加的文档7"}
    2020-06-12 10:14:16.389  INFO 14604 --- [           main] c.e.t.e.SpringDataElasticSearchTest      : 【文章】= {"content":"新添加的文档内容8","id":8,"title":"新添加的文档8"}
    2020-06-12 10:14:16.389  INFO 14604 --- [           main] c.e.t.e.SpringDataElasticSearchTest      : 【文章】= {"content":"新添加的文档内容9","id":9,"title":"新添加的文档9"}
    2020-06-12 10:14:16.390  INFO 14604 --- [           main] c.e.t.e.SpringDataElasticSearchTest      : 【文章】= {"content":"新添加的文档内容10","id":10,"title":"新添加的文档10"}
    2020-06-12 10:14:16.390  INFO 14604 --- [           main] c.e.t.e.SpringDataElasticSearchTest      : 【文章】= {"content":"新添加的文档内容11","id":11,"title":"新添加的文档11"}
    2020-06-12 10:14:16.391  INFO 14604 --- [           main] c.e.t.e.SpringDataElasticSearchTest      : 【文章】= {"content":"新添加的文档内容12","id":12,"title":"新添加的文档12"}
    2020-06-12 10:14:16.391  INFO 14604 --- [           main] c.e.t.e.SpringDataElasticSearchTest      : 【文章】= {"content":"新添加的文档内容13","id":13,"title":"新添加的文档13"}
    2020-06-12 10:14:16.391  INFO 14604 --- [           main] c.e.t.e.SpringDataElasticSearchTest      : 【文章】= {"content":"新添加的文档内容14","id":14,"title":"新添加的文档14"}
    2020-06-12 10:14:16.391  INFO 14604 --- [           main] c.e.t.e.SpringDataElasticSearchTest      : 【文章】= {"content":"新添加的文档内容15","id":15,"title":"新添加的文档15"}
    

可以看到查询到的总数是对的但是,分页后的为1(随意修改分页的size,结果始终为1),明显存在问题。看源码:

public int getTotalPages() {
   return this.getSize() == 0 ? 1 : (int)Math.ceil((double)this.total / (double)this.getSize());
}

分析应该是获取到的分页size为0导致的问题,可能是由于版本不兼容的问题

解决

  • 修改pom文件
    升级springboot的版本:2.0.1.RELEASE升级为2.0.4.RELEASE ,并将 实体类中属性的注解@Field(type = FieldType.Text中的常量首字母大写(Keyword、Date等都一样)

    <!-- 修改前 -->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.1.RELEASE</version>
        <relativePath/>
    </parent>
    
    <!-- 修改后 -->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.4.RELEASE</version>
        <relativePath/>
    </parent>
    
    // 修改前
    @Id //主键
    private Long id;
    @Field(type = FieldType.text, index = true, store = true, analyzer = "ik_smart")
    private String title; // 标题
    @Field(type = FieldType.text, index = true, store = true, analyzer = "ik_smart")
    private String content;// 内容
    
    // 修改后
    @Id //主键
    private Long id;
    @Field(type = FieldType.Text, index = true, store = true, analyzer = "ik_smart")
    private String title; // 标题
    @Field(type = FieldType.Text, index = true, store = true, analyzer = "ik_smart")
    private String content;// 内容
    
  • 结果

    2020-06-12 10:14:16.217  INFO 14604 --- [           main] c.e.t.e.SpringDataElasticSearchTest      : 【文章】总条数 = 99
    2020-06-12 10:14:16.218  INFO 14604 --- [           main] c.e.t.e.SpringDataElasticSearchTest      : 【文章】总页数 = 7
    2020-06-12 10:14:16.385  INFO 14604 --- [           main] c.e.t.e.SpringDataElasticSearchTest      : 【文章】= {"content":"新添加的文档内容1","id":1,"title":"新添加的文档1"}
    2020-06-12 10:14:16.386  INFO 14604 --- [           main] c.e.t.e.SpringDataElasticSearchTest      : 【文章】= {"content":"新添加的文档内容2","id":2,"title":"新添加的文档2"}
    2020-06-12 10:14:16.387  INFO 14604 --- [           main] c.e.t.e.SpringDataElasticSearchTest      : 【文章】= {"content":"新添加的文档内容3","id":3,"title":"新添加的文档3"}
    2020-06-12 10:14:16.387  INFO 14604 --- [           main] c.e.t.e.SpringDataElasticSearchTest      : 【文章】= {"content":"新添加的文档内容4","id":4,"title":"新添加的文档4"}
    2020-06-12 10:14:16.387  INFO 14604 --- [           main] c.e.t.e.SpringDataElasticSearchTest      : 【文章】= {"content":"新添加的文档内容5","id":5,"title":"新添加的文档5"}
    2020-06-12 10:14:16.388  INFO 14604 --- [           main] c.e.t.e.SpringDataElasticSearchTest      : 【文章】= {"content":"新添加的文档内容6","id":6,"title":"新添加的文档6"}
    2020-06-12 10:14:16.388  INFO 14604 --- [           main] c.e.t.e.SpringDataElasticSearchTest      : 【文章】= {"content":"新添加的文档内容7","id":7,"title":"新添加的文档7"}
    2020-06-12 10:14:16.389  INFO 14604 --- [           main] c.e.t.e.SpringDataElasticSearchTest      : 【文章】= {"content":"新添加的文档内容8","id":8,"title":"新添加的文档8"}
    2020-06-12 10:14:16.389  INFO 14604 --- [           main] c.e.t.e.SpringDataElasticSearchTest      : 【文章】= {"content":"新添加的文档内容9","id":9,"title":"新添加的文档9"}
    2020-06-12 10:14:16.390  INFO 14604 --- [           main] c.e.t.e.SpringDataElasticSearchTest      : 【文章】= {"content":"新添加的文档内容10","id":10,"title":"新添加的文档10"}
    2020-06-12 10:14:16.390  INFO 14604 --- [           main] c.e.t.e.SpringDataElasticSearchTest      : 【文章】= {"content":"新添加的文档内容11","id":11,"title":"新添加的文档11"}
    2020-06-12 10:14:16.391  INFO 14604 --- [           main] c.e.t.e.SpringDataElasticSearchTest      : 【文章】= {"content":"新添加的文档内容12","id":12,"title":"新添加的文档12"}
    2020-06-12 10:14:16.391  INFO 14604 --- [           main] c.e.t.e.SpringDataElasticSearchTest      : 【文章】= {"content":"新添加的文档内容13","id":13,"title":"新添加的文档13"}
    2020-06-12 10:14:16.391  INFO 14604 --- [           main] c.e.t.e.SpringDataElasticSearchTest      : 【文章】= {"content":"新添加的文档内容14","id":14,"title":"新添加的文档14"}
    2020-06-12 10:14:16.391  INFO 14604 --- [           main] c.e.t.e.SpringDataElasticSearchTest      : 【文章】= {"content":"新添加的文档内容15","id":15,"title":"新添加的文档15"}
    
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章