lucene3.0 分页显示与高亮显示 实现的 分页 与 高亮显示
分页类
package com.cee.com;
import java.util.List;
//分页类
public class PageBean {
private List list; // 要返回的某一页的记录列表
private int allRow; // 总记录数
private int totalPage; // 总页数
private int currentPage; // 当前页
private int pageSize; // 每页记录数
private int offset;
public int getOffset() {
return offset;
}
public void setOffset(int offset) {
this.offset = offset;
}
private boolean isFirstPage; // 是否为第一页
private boolean isLastPage; // 是否为最后一页
private boolean hasPreviousPage; // 是否有前一页
private boolean hasNextPage; // 是否有下一页
public List getList() {
return list;
}
public void setList(List list) {
this.list = list;
}
public int getAllRow() {
return allRow;
}
public void setAllRow(int allRow) {
this.allRow = allRow;
}
public int getTotalPage() {
int totalPage = allRow % pageSize == 0 ? allRow / pageSize : allRow
/ pageSize + 1;
return totalPage;
}
public void setTotalPage(int totalPage) {
this.totalPage = totalPage;
}
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 void init() {
this.isFirstPage = isFirstPage();
this.isLastPage = isLastPage();
this.hasPreviousPage = isHasPreviousPage();
this.hasNextPage = isHasNextPage();
}
/** */
/**
* 以下判断页的信息,只需getter方法(is方法)即可
*
* @return
*/
public boolean isFirstPage() {
return currentPage == 1; // 如是当前页是第1页
}
public boolean isLastPage() {
return currentPage == totalPage; // 如果当前页是最后一页
}
public boolean isHasPreviousPage() {
return currentPage != 1; // 只要当前页不是第1页
}
public boolean isHasNextPage() {
if(totalPage==0){
return false;
}else{
return currentPage != totalPage; // 只要当前页不是最后1页
}
} /** */
/**
* 计算总页数,静态方法,供外部直接通过类名调用
*
* @param pageSize
* 每页记录数
* @param allRow
* 总记录数
* @return 总页数
*/
public static int countTotalPage(final int pageSize, final int allRow) {
int totalPage = allRow % pageSize == 0 ? allRow / pageSize : allRow
/ pageSize + 1;
return totalPage;
}
/** */
/**
* 计算当前页开始记录
*
* @param pageSize
* 每页记录数
* @param currentPage
* 当前第几页
* @return 当前页开始记录号
*/
public static int countOffset(final int pageSize, final int currentPage) {
final int offset = pageSize * (currentPage - 1);
return offset;
}
/** */
/**
* 计算当前页,若为0或者请求的URL中没有"?page=",则用1代替
*
* @param page
* 传入的参数(可能为空,即0,则返回1)
* @return 当前页
*/
public static int countCurrentPage(int page) {
final int curPage = (page == 0 ? 1 : page);
return curPage;
}
public static int lastSqlIdx(int rowStartIdx, int pageSize) {
return rowStartIdx + pageSize;
}
}
分页代码与高亮代码
注意 indexDir 目录下存放的是 lucene 的索引, 直接运行代码会发生错误,请看上篇文章生成索引
package com.cee.test;
import java.io.File;
import java.io.IOException;
import java.io.StringReader;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.TokenStream;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.index.CorruptIndexException;
import org.apache.lucene.queryParser.MultiFieldQueryParser;
import org.apache.lucene.queryParser.ParseException;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.Searcher;
import org.apache.lucene.search.TopScoreDocCollector;
import org.apache.lucene.search.highlight.Highlighter;
import org.apache.lucene.search.highlight.InvalidTokenOffsetsException;
import org.apache.lucene.search.highlight.QueryScorer;
import org.apache.lucene.search.highlight.SimpleHTMLFormatter;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.util.Version;
import com.cee.com.PageBean;
/**
* 分页与高亮显示
*
* @author qcy
*
*/
public class PageSearcher {
/**
*
* @param pageNo
* @param pageSize
* @param q
* 表示查询条件
* @return
*/
public final static String indexDir = "d:\\TestLucene\\indexDB";
@SuppressWarnings({ "unchecked", "unchecked", "deprecation", "deprecation" })
public static PageBean getPageQuery(int pageNo, int pageSize, String[] q)
throws CorruptIndexException, IOException, ParseException, InvalidTokenOffsetsException {
List result = new ArrayList();
Searcher searcher = new IndexSearcher(FSDirectory.open(new File(
indexDir)), true);
Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_CURRENT);
String[] fields = { "cbs", "zz" };
Query query = MultiFieldQueryParser.parse(Version.LUCENE_CURRENT, q,
fields, analyzer);
TopScoreDocCollector topCollector = TopScoreDocCollector.create(
searcher.maxDoc(), false);
searcher.search(query, topCollector);
// 高亮设置
SimpleHTMLFormatter simpleHtmlFormatter = new SimpleHTMLFormatter(
"<B>", "</B>");//
Highlighter highlighter = new Highlighter(simpleHtmlFormatter,
new QueryScorer(query));
// 查询当页的记录
ScoreDoc[] docs = topCollector.topDocs((pageNo - 1) * pageSize,
pageSize).scoreDocs;
for (ScoreDoc scdoc : docs) {
Document document = searcher.doc(scdoc.doc);
TokenStream tokenStream = analyzer.tokenStream("text",
new StringReader(document.get("cbs")));
String str = highlighter.getBestFragment(tokenStream, document.get("cbs"));
result.add("id=" + document.get("id") + "|cbs="
+ document.get("cbs") + "|zz=" + document.get("zz")+"|red"+str);
}
PageBean pb = new PageBean();
pb.setCurrentPage(pageNo);// 当前页
pb.setPageSize(pageSize);
pb.setAllRow(topCollector.getTotalHits());// hit中的记录数目
pb.setList(result);
return pb;
}
public static void main(String[] args) throws CorruptIndexException,
IOException, ParseException, InvalidTokenOffsetsException {
String[] q = { "中国", "外国" };
long start = new Date().getTime();
PageBean pb = getPageQuery(1, 4, q);
System.out.println("页面内容-------开始---");
List pgResult = pb.getList();
for (int i = 0; i < pgResult.size(); i++) {
System.out.println(pgResult.get(i).toString());
}
System.out.println("页面内容-------结束---");
System.out.println("当前页号 " + pb.getCurrentPage());
System.out.println("是否是第一个页? " + pb.isFirstPage());
System.out.println("是否是最后页? " + pb.isLastPage());
System.out.println("存在上一页? " + pb.isHasPreviousPage());
System.out.println("存在下一页? " + pb.isHasNextPage());
System.out.println("每页的记录数 " + pb.getPageSize());
System.out.println("总页数 " + pb.getTotalPage());
System.out.println("总记录数 " + pb.getAllRow());
long end = new Date().getTime();
System.out.println("花费时间:" + (double) (end - start) / 1000 + "秒");
}
}
分页类有个小bug
分页的前台scrip
function changepage(pid){
var url="";
if(pid=='1'){
window.location=url+"&page=1";
}
if(pid=='2'){
window.location=url+"&page=${dataList.currentPage-1}";
}
if(pid=='3'){
window.location=url+"&page=${dataList.currentPage+1}";
}
if(pid=='4'){
window.location=url+"&page=${dataList.totalPage}";
}
}
前台分页java
<table>
<tr>
<td>
<table>
<c:forEach items="${dataList.list}" var="m"> ${m}</c:forEach>
</table>
</td>
</tr>
<tr>
<td>
<table width="100%" border="0" cellspacing="2" cellpadding="0">
<tr>
<td height="25" align="center">
<div id="page" class="txt_p">
共${dataList.totalPage}页
<c:choose>
<c:when test="${dataList.hasPreviousPage}">
<a href="javascript:changepage('1')">首页</a>
<a href="javascript:changepage('2')"> <img
src="${skinPath}images/hygl/left_h.gif" align="absmiddle"
border="0" /> </a>
<a href="javascript:changepage('2')">上一页</a>
</c:when>
<c:otherwise>
首页
<img src="${skinPath}images/hygl/left_b.gif" align="absmiddle" />上一页
</c:otherwise>
</c:choose>
第${dataList.currentPage}页
<c:choose>
<c:when test="${dataList.hasNextPage}">
<a href="javascript:changepage('3')">下一页</a>
<a href="javascript:changepage('3')"> <img
src="${skinPath}images/hygl/right_h.gif" align="absmiddle"
border="0" /> </a>
<a href="javascript:changepage('4')">尾页</a>
</c:when>
<c:otherwise>
下一页<img
src="${skinPath}images/hygl/right_b.gif" align="absmiddle" />尾页
</c:otherwise>
</c:choose>
</div>
</td>
</tr>
</table>
</td>
</tr>
</table>
分享到:
相关推荐
lucene3.0 lucene3.0 lucene3.0 lucene3.0 lucene3.0
lucene 3.0 API中文帮助,学习的人懂得的
【Lucene3.0查询类型详解】 在Lucene3.0中,查询处理是一个关键环节,涉及多种查询方式和理论模型。以下是对这些概念的详细解释: 1. **查询方式**: - **顺序查询**:是最简单的查询方式,直接遍历索引,效率较...
《Lucene 3.0 原理与代码分析完整版》是一本深入解析Lucene 3.0搜索引擎库的专业书籍。Lucene是Apache软件基金会的开源项目,它为Java开发者提供了一个高性能、全文检索的工具包,广泛应用于各种信息检索系统。这...
lucene3.0 中文分词器, 庖丁解牛
这里的"lucene3.0核心jar包"是 Lucene 的一个重要版本,发布于2009年,为当时的开发人员提供了构建全文搜索引擎的基础框架。 在 Lucene 3.0 中,以下几个关键知识点值得关注: 1. **索引结构**:Lucene 使用倒排...
lucene3.0-highlighter.jar lucene3.0的高亮jar包,从lucene3.0源码中导出来的
这里我们主要聚焦于`lucene3.0`版本,该版本在当时是Lucene的一个重要里程碑,引入了许多改进和新特性。 1. **索引构建**: 在Lucene3.0中,索引是数据检索的基础。它通过将文本数据转换为倒排索引来实现快速查询...
在 Lucene 3.0 版本中,虽然已经相对较旧,但仍然包含了基本的搜索引擎功能,适用于简单或特定场景的搜索需求。在这个实例中,我们将探讨如何在 JDK 1.5 和 Lucene 3.0 的环境下构建和运行一个简单的搜索引擎。 ...
**Lucene 3.0 全文信息检索** Lucene 是一个由Apache软件基金会4 Jakarta项目组开发的开源全文检索引擎工具包。自1999年发布以来,Lucene 已经发展成为Java世界中最为广泛使用的全文检索库,为开发者提供了构建高...
《深入剖析Lucene3.0:庖丁解牛与索引搜索实践》 在IT行业中,搜索引擎技术扮演着至关重要的角色,而Lucene作为一个开源全文检索库,为开发者提供了强大的文本搜索功能。本文将深入探讨Lucene3.0版本,结合“庖丁解...
在使用lucene3与paoding集成的时候可能会出现以下错误: Exception in thread "main" java.lang.AbstractMethodError: org.apache.lucene.analysis.TokenStream.incrementToken()Z at org.apache.lucene.index....
在本文中,我们将深入探讨Lucene 3.0版本,了解其核心概念、功能特性,并通过实例来展示如何使用这个强大的工具。 ### 1. Lucene 3.0核心概念 #### 1.1 文档与字段 在Lucene中,数据是以文档(Document)的形式...
本文将重点介绍如何使用 Lucene 3.0 实现全文检索的基本步骤,以及与前一版本 Lucene 2.0 的主要区别。 **1. 安装与环境配置** 首先,你需要下载 Lucene 3.0 的发行版,并将其添加到你的项目类路径中。确保你的开发...
SSH + Lucene + 分页 + 排序 + 高亮 模拟简单新闻网站搜索引擎--NewsWithSearch.part3 SSH + Lucene + 分页 + 排序 + 高亮 模拟简单新闻网站搜索引擎--NewsWithSearch.part2 SSH + Lucene + 分页 + 排序 + 高亮 ...
在这个“Lucene3.0增删改查和关键字高亮实例”项目中,我们将深入理解如何利用Lucene 3.0版本进行索引构建、文档的增删改查操作,并学习关键字高亮显示的实现方法。 首先,我们要了解**创建索引**的基本流程。在...
实例是一个java实例,可直接导入到MyEclipse中...其中是lucene3.0整合了庖丁解牛分词法,添加了高亮显示。因为lucene3.0无法整合paoding-analysis.jar 所以我已经把paoding-analysis中的源码整合进来了避免无法整合问题