解決使用 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"}
    
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章