Lucene中使用分页

Lucene3.5中提供了一个分页方法:searchAfter方法,可以方便的分页,不过仍然需要把大量数据取出。

/**
	 * 分页搜索
	 * 把所有数据都取出来才行
	 * 可以把每次需要分页的内容取出来,没有必要一次性取出所有的东西
	 * 比如:每页存放10个内容,需要第一页就取出10个内容,需要第二页就去取出20个内容
	 * @return 
	 * @throws IOException 
	 * @throws IOException 
	 */
public static ScoreDoc getLastScoreDoc(int pageIndex, int pageSize, Query query,
        IndexSearcher searcher) throws IOException
{
	if(pageIndex==1)
		return null;
	//取出上一页的数量
	int num = pageSize*(pageIndex-1);
	TopDocs tds = searcher.search(query, num);
	//根据页码和分页大小返回最后一个scoreDoc
	return tds.scoreDocs[num-1];
}
public static void searchByPage(String indexDir, int pageIndex, int pageSize, 
        String query, String fieldname) throws IOException
{
	//打开存放索引的目录
	Directory dir = FSDirectory.open(new File(indexDir));
	IndexReader reader = IndexReader.open(dir);
	IndexSearcher is = new IndexSearcher(reader);
	QueryParser parser = new QueryParser(Version.LUCENE_35, fieldname, 
              new StandardAnalyzer(Version.LUCENE_35));
	try {
		Query q = parser.parse(query);
                //得到上一页的最后一个记录
		ScoreDoc lastsd = getLastScoreDoc(pageIndex, pageSize, q, is);
		TopDocs tds = is.searchAfter(lastsd, q, 1);
		for(ScoreDoc s1:tds.scoreDocs)
		{
			Document doc = is.doc(s1.doc);
			System.out.println(s1.doc+doc.get("filename"));
		}
	} catch (ParseException e) {
		e.printStackTrace();
	}
	is.close();
}

 在主函数中运行:

String indexDir = args[0];
//查询部分,比如在内容中查询,在目录中查询
String s = args[1];
//要查询字符串
String query = args[2];
//分别为第一页第二页第三页,会重叠
searchByPage(indexDir, 1, 1, query, s);
searchByPage(indexDir, 2, 1, query, s);
searchByPage(indexDir, 3, 1, query, s);

 输入参数:

D:\abc\Lucene\index03 contents Lucene
 

猜你喜欢

转载自jkhhuse.iteye.com/blog/1574583