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