專案中如何使用solr(續)--分頁
阿新 • • 發佈:2019-02-07
分頁物件,我們看一下常見的分頁
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);
}
}