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