`

lucene第一步---6.分页

阅读更多
lucene第一步---6.分页
创建测试数据的索引
String path = "index";//索引目录
Analyzer analyzer = new IKAnalyzer();//采用的分词器
IndexWriter iwriter = new IndexWriter(path, analyzer, true);  
File dir = new File("data");//
File[] files = dir.listFiles();
for(int i=0;i<files.length;i++){
	Document doc = new Document();
	File file = files[i];
	System.out.println(file.getName());
	System.out.println(file.getPath());
	FileInputStream fis = new FileInputStream(file);
	String content = "";
	BufferedReader reader = new BufferedReader(new InputStreamReader(fis));

StringBuffer buffer = new StringBuffer("");
content = reader.readLine();
while (content != null) {
    buffer.append(content);
    content = reader.readLine();
}
System.out.println("content : "+buffer.toString());
doc.add(new Field("title",file.getName(),Field.Store.YES,Field.Index.ANALYZED));
doc.add(new Field("content",buffer.toString(),Field.Store.YES,Field.Index.ANALYZED));
iwriter.addDocument(doc);
}
iwriter.close();

我们创建分页类,没什么说的一个bean
import java.util.ArrayList;

import org.apache.lucene.document.Document;

public class Page{
	private static int DEFAULT_PAGE_SIZE = 5;

	private int pageSize = DEFAULT_PAGE_SIZE; // 每页的记录数

	private long start; // 当前页第一条数据在数据集合中的位置,从0开始

	private Object data; // 当前页中存放的记录,类型一般为List

	private long totalCount; // 总记录数

	public Page() {
		this(0, 0, 5,new ArrayList<Document>());
	}

	public Page(long start, long totalCount, int pageSize, Object data) {
		this.start = start;
		this.totalCount = totalCount;
		this.pageSize = pageSize;
		this.data = data;
	}
	
	/**
	 * 取得总记录数
	 * @return
	 */
	public long getTotalCount() {
		return this.totalCount;
	}
	/**
	 * 取当前页中的数据
	 * @return
	 */
	public Object getResult() {
		return this.data;
	}
	
	/**
	 * 取每页的数据容量
	 * @return
	 */
	public int getPageSize() {
		return this.pageSize;
	}
	/**
	 * 取总页数
	 * @return
	 */
	public long getTotalPageCount() {
		return totalCount % pageSize == 0 ? totalCount / pageSize : totalCount
				/ pageSize + 1;
	}
	
	/**
	 * 取当前的页号
	 * @return
	 */
	public long getCurrentPageNo(){
		return start/pageSize+1;
	}
	
	/**
	 * 该页是否有下一页.
	 */
	public boolean hasNextPage() {
		return this.getCurrentPageNo() < this.getTotalPageCount();
	}

	/**
	 * 该页是否有上一页.
	 */
	public boolean hasPreviousPage() {
		return this.getCurrentPageNo() > 1;
	}

	/**
	 * 获取任一页第一条数据在数据集的位置,每页条数使用默认值.
	 *
	 * @see #getStartOfPage(int,int)
	 */
	protected static int getStartOfPage(int pageNo) {
		return getStartOfPage(pageNo, DEFAULT_PAGE_SIZE);
	}

	/**
	 * 获取任一页第一条数据在数据集的位置.
	 *
	 * @param pageNo   从1开始的页号
	 * @param pageSize 每页记录条数
	 * @return 该页第一条数据
	 */
	public static int getStartOfPage(int pageNo, int pageSize) {
		return (pageNo - 1) * pageSize;
	}
}


下面我们做一个分页方法并进行测试

public class PageSearcher {

	@SuppressWarnings("unchecked")
	public static void main(String[] args) throws IOException {
		String path = "index";//索引目录
		Directory dir = FSDirectory.open(new File(path));
		IndexSearcher searcher = new IndexSearcher(dir,true);
		Term term = new Term("content","网友");
		Query query = new TermQuery(term);
		Page page = getPageQuery(3, 3, query, searcher);
		System.out.println("当前页号 "+page.getCurrentPageNo());
		System.out.println("存在上一页? " + page.hasPreviousPage());
		System.out.println("存在下一页? " + page.hasNextPage());
		System.out.println("每页的记录数 " + page.getPageSize());
		System.out.println("总页数 " + page.getTotalPageCount());
		System.out.println("总记录数 " + page.getTotalCount());
		//显示页面内容
		
		ArrayList<Document> docs = (ArrayList<Document>) page.getResult();
		for(Document doc:docs){
			System.out.println(doc.get("content"));
		}
		
		
	}
	/**
	 * 获取当前页
	 * @param pageNo 页号 从1开始
	 * @param pageSize 每页显示的最多记录条数
	 * @param query Query
	 * @param searcher Searcher
	 * @return
	 */
	public static Page getPageQuery(int pageNo,int pageSize,Query query,Searcher searcher){
		TopScoreDocCollector topCollector=null;
		List<Document> result = new ArrayList<Document>();
		try {
			//得到查询结果的总记录数
			topCollector = TopScoreDocCollector.create(searcher.maxDoc(), false);
			searcher.search(query, topCollector);
			//查询当页的记录
			ScoreDoc [] docs = topCollector.topDocs((pageNo-1)*pageSize,pageSize).scoreDocs;
			for(ScoreDoc scdoc : docs){
				try {
					result.add(searcher.doc(scdoc.doc));
				} catch (CorruptIndexException e) {
					e.printStackTrace();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
			return new Page(Page.getStartOfPage(pageNo,pageSize),topCollector.getTotalHits(),pageSize,result);
		} catch (IOException e1) {
			e1.printStackTrace();
		}
		
		return new Page();
	}
}
 

分享到:
评论

相关推荐

    第一个lucene程序

    1. **创建索引**:这是Lucene工作的第一步,它会把文档内容解析成一系列的术语(tokens),然后为每个术语建立倒排索引。倒排索引是一种数据结构,它允许快速查找包含特定术语的文档。 2. **索引写入**:在创建索引...

    lucene-sequence-diagram:lucene搜索端uml时序图,lucene源码解析

    图中第【2】步,使用query生成weight;query就是查询参数,weight即对查询参数赋予权重,比如查询title包含"lucene"的文章,则首先对"lucene"这个term赋予权重 1.1 对"lucene"这个term赋予权重,需要先从索引文件中读取...

    LUCENE的搜索引擎例子

    1. **索引创建**:这是搜索引擎的第一步,我们需要遍历要索引的数据源(例如文件系统、数据库等),读取内容,并使用Lucene的Analyzer进行分词,然后创建Term(词项)和Document(文档)。Analyzer是负责文本分析的...

    lucene实现企业搜索实例

    创建索引是Lucene的第一步,这涉及到对文档数据的读取、分析和存储。你需要定义一个`Document`对象,然后添加各种字段,如`Field("title", "文档标题")`,`Field("content", "文档内容")`等。接着,使用`IndexWriter...

    Lucene实现全文检索

    2. **分词器(Tokenizer)**:分词器将连续的文本分解为单独的词语,这是建立索引的第一步。Lucene提供多种分词器,如StandardTokenizer,适用于大多数情况。 3. **文档(Document)**:在Lucene中,每个要搜索的...

    【ASP.NET编程知识】基于ASP.NET的lucene.net全文搜索实现步骤.docx

    创建索引是全文搜索的第一步。你需要定义一个文档类,该类包含你要索引的字段,比如标题、内容等。然后,使用`Document`类实例化这个文档,并添加字段。接下来,使用`IndexWriter`类创建一个索引写入器,将文档写入...

    lucence3.6.1 示例完整包

    分词是文本检索的第一步,将文本拆分成有意义的词汇单元。庖丁解牛分词器以其对中文词汇的精确切分而著称,特别适合处理中文文档,提高搜索精度。在Lucene中,我们可以通过配置Analyzer来使用它,确保文本数据被正确...

    用ASP建立站内信息搜索系统

    **第一步:数据库准备** 首先,我们需要创建一个数据库来存储待搜索的信息。这里使用Access 97创建一个名为`list.mdb`的数据库,并在其中建立一个名为`list`的表。表中包含以下字段: 1. ID(编号):作为每条记录...

    solr4.4.0入门配置步骤

    第一步,下载Solr4.4.0安装包。可以通过访问Solr的官方网站下载相应的压缩包。通常solr的安装包会包含example目录,该目录有Solr的示例应用和一些配置文件。对于Solr4.4.0版本,下载地址为***,用户可以在此地址获取...

    JAVA上百实例源码以及开源项目源代码

    多人聊天室 3个目标文件 第一步:运行ServerData.java 启动服务器,然后服务器处于等待状态 第二步:运行LoginData.java 启动(客户端)登陆界面 输入用户名 ip为本机localhost 第三步:在登陆后的界面文本框输入文本...

    Elasticsearch全文检索

    创建索引是使用Elasticsearch的第一步。索引是存储和检索文档的地方,类似于关系数据库中的表。在ES中,可以通过` IndicesAdminClient `接口或者使用` RestHighLevelClient `的` createIndex `方法来创建索引。索引...

    elasticsearch学习入门

    创建索引和映射(Mapping)是使用Elasticsearch的第一步。映射定义了字段的类型和特性,例如在例子中,"content"和"title"字段使用了IK分词插件进行中文分词,"author"、"publish_date"和"category"字段则进行了不...

Global site tag (gtag.js) - Google Analytics