1. 程式人生 > >專案中如何使用solr(續)--分頁

專案中如何使用solr(續)--分頁

分頁物件,我們看一下常見的分頁

csdn部落格中的分頁

這裡寫圖片描述

部落格園部落格的分頁

這裡寫圖片描述

開源中國部落格分頁

這裡寫圖片描述

基本的分頁也就是下面幾個欄位

當前頁(currentPage)

每頁顯示的記錄數(pageSize)

總記錄數(totalCount)

返回的資料(datas)

這裡寫圖片描述


import java.util.List;
import java.util.Map;

/**
 * 分頁物件
 * 
 * @author 程高偉
 * @time 2017年5月21日下午8:35:01
 */
public class Page<T> {

    /** 每頁顯示記錄數預設為10條 */
public static final int DEFAULT_PAGE_SIZE = 10; /** 當前頁碼, 從1開始計 */ private int currentPage; /** 每頁記錄數 */ private int pageSize; /** 總記錄數 */ private long totalCount; /** 查詢條件 */ private Map<String, Object> conditions; /** 當前頁資料 */ private List<?> datas; public Page() { // 預設建構函式
currentPage = 1; pageSize = DEFAULT_PAGE_SIZE; } /** 獲取當前頁碼 */ public int getCurrentPage() { return currentPage; } /** 設定當前頁碼 */ public void setCurrentPage(int currentPage) { this.currentPage = currentPage; } /** 獲取每頁顯示記錄數 */ public int getPageSize() { return
pageSize; } /** 設定每頁顯示記錄數 */ public void setPageSize(int pageSize) { this.pageSize = pageSize; } /** 獲取查詢引數 */ public Map<String, Object> getConditions() { return conditions; } /** 設定查詢引數 */ public void setConditions(Map<String, Object> conditions) { this.conditions = conditions; } /** 獲取當前頁資料 */ public List<?> getDatas() { return datas; } /** 設定當前頁資料 */ public void setDatas(List<?> datas) { this.datas = datas; } /** 獲取總記錄數 */ public long getTotalCount() { return totalCount; } /** 設定總記錄數 */ public void setTotalCount(long totalCount) { this.totalCount = totalCount; } /** 獲取總頁數 */ public long getTotalPages() { if (datas == null || datas.isEmpty()) return 0; long totalPages = totalCount / pageSize; if (totalCount % pageSize != 0) { totalPages++; } return totalPages; } /** 獲取從第幾條資料開始查詢 */ public long getStart() { return (currentPage - 1) * pageSize; } /** 判斷是否還有前一頁 */ public boolean getHasPrevious() { return currentPage == 1 ? false : true; } /** 判斷是否還有後一頁 */ public boolean getHasNext() { return (getTotalPages() != 0 && getTotalPages() != currentPage) ? true : false; } }

分頁查詢方法

public static <T> Page<T> getByPage(Page<T> page) {

        SolrQuery query = new SolrQuery();

        // 釋出時間降序排列
        query.setSort("createTime", ORDER.desc);
        // 開始頁
        query.setStart((int) page.getStart());
        // 每頁顯示條數
        query.setRows(page.getPageSize());

        if (StringUtils.isBlank(page.getConditions().get("keywords").toString())) {
            page.getConditions().put("keywords", "*");
            query.setHighlight(false);// 開啟高亮元件
        }else{
            // 設定高亮
            query.setHighlight(true);// 開啟高亮元件
            query.addHighlightField("title");// 高亮欄位
            query.addHighlightField("content");// 高亮欄位
            query.setHighlightSimplePre("<font color='red'>");// 標記,高亮關鍵字字首
            query.setHighlightSimplePost("</font>");// 字尾
            query.setHighlight(true).setHighlightSnippets(1);
            // 獲取高亮分片數,一般搜尋詞可能分佈在文章中的不同位置,其所在一定長度的語句即為一個片段,預設為1,但根據業務需要有時候需要多取出幾個分片。
            query.setHighlightFragsize(100);// 每個分片的最大長度,預設為100。適當設定此值,如果太小,高亮的標題可能會顯不全;設定太大,摘要可能會太長。
        }
        // 關鍵字
        String keywords =page.getConditions().get("keywords").toString();
        query.setQuery("title:" + keywords + "or content:" + keywords + "or author:" + keywords);
        try {
            QueryResponse response = client.query(query);
            List<ArticleSolr> articleList = response.getBeans(ArticleSolr.class);
            SolrDocumentList docs = response.getResults();
            if(query.getHighlight()){
                // 獲取所有高亮的欄位
                Map<String, Map<String, List<String>>> highlightMap = response.getHighlighting();
                for (int i = 0; i < articleList.size(); ++i) {
                    String id = articleList.get(i).getId();
                    if (highlightMap.get(id) != null && highlightMap.get(id).get("title") != null) {
                        articleList.get(i).setTitle(highlightMap.get(id).get("title").get(0));
                    }
                    if (highlightMap.get(id) != null && highlightMap.get(id).get("content") != null) {
                        articleList.get(i).setContent(highlightMap.get(id).get("content").get(0));
                    }
                }
            }
            page.setDatas(articleList);
            page.setTotalCount(docs.getNumFound());


        } catch (Exception e) {
            logger.error("從solr根據Page查詢分頁文件時遇到錯誤", e);
        }
        return page;
    }

分頁測試用例

@Test
    public void testPage() {
        Page<?> page = new Page<>();
        Map<String, Object> conditions = new HashMap<String, Object>();
        conditions.put("keywords", "部落格");// 指定關鍵字keywords
        page.setConditions(conditions);
        page.setPageSize(10);
        page.setCurrentPage(19);

        Page<?> result = SolrUtil.getByPage(page);
        System.out.println("總記錄數" + result.getTotalCount());
        System.out.println("每頁顯示記錄數" + result.getPageSize());
        System.out.println("總頁數" + result.getTotalPages());
        System.out.println("當前頁碼" + result.getCurrentPage());
        System.out.println("從第幾條資料開始查詢" + result.getStart());
        System.out.println("當前頁資料" + result.getDatas().size());
        System.out.println("有上一頁" + result.getHasNext());
        System.out.println("有下一頁" + result.getHasNext());
        Iterator<?> iter = result.getDatas().iterator();
        while (iter.hasNext()) {
            ArticleSolr article = (ArticleSolr) iter.next();
            System.out.println(article);
        }

    }

這裡寫圖片描述