lucene 分页
来源:互联网 发布:手机蒙文软件 编辑:程序博客网 时间:2024/05/20 13:37
package Java.se.lucene;//创建索引import java.io.File;import java.io.FileReader;import java.io.IOException;import org.apache.lucene.analysis.standard.StandardAnalyzer;import org.apache.lucene.document.Document;import org.apache.lucene.document.Field;import org.apache.lucene.document.NumericField;import org.apache.lucene.index.CorruptIndexException;import org.apache.lucene.index.IndexWriter;import org.apache.lucene.index.IndexWriterConfig;import org.apache.lucene.store.Directory;import org.apache.lucene.store.FSDirectory;import org.apache.lucene.store.LockObtainFailedException;import org.apache.lucene.util.Version;public class PageIndex {private static Directory directory=null;static{try {directory=FSDirectory.open(new File("f:/lucene/Index05"));} catch (IOException e) {e.printStackTrace();}}public static Directory getDirectory(){return directory;}public void Index(boolean hasNew){IndexWriter writer=null;try { writer=new IndexWriter(directory,new IndexWriterConfig(Version.LUCENE_36, new StandardAnalyzer(Version.LUCENE_36)));if(hasNew){writer.deleteAll();}File file=new File("F:/lucene/lucenes");Document doc=null;for(File f:file.listFiles()){doc=new Document();doc.add(new Field("content",new FileReader(f)));//添加内容doc.add(new Field("filename",f.getName(),Field.Store.YES,Field.Index.NOT_ANALYZED));//添加Namedoc.add(new Field("path",f.getAbsolutePath(),Field.Store.YES,Field.Index.NOT_ANALYZED));doc.add(new NumericField("date",Field.Store.YES, true).setLongValue(f.lastModified()));doc.add(new NumericField("size",Field.Store.YES,true).setIntValue((int)f.length()/1024));writer.addDocument(doc);}} catch (CorruptIndexException e) {e.printStackTrace();} catch (LockObtainFailedException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}finally{if(writer!=null){try {writer.close();} catch (CorruptIndexException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}}}}package Java.se.lucene;//创建搜索import java.io.IOException;import org.apache.lucene.analysis.standard.StandardAnalyzer;import org.apache.lucene.document.Document;import org.apache.lucene.index.CorruptIndexException;import org.apache.lucene.index.IndexReader;import org.apache.lucene.queryParser.ParseException;import org.apache.lucene.queryParser.QueryParser;import org.apache.lucene.search.IndexSearcher;import org.apache.lucene.search.Query;import org.apache.lucene.search.ScoreDoc;import org.apache.lucene.search.TopDocs;import org.apache.lucene.store.Directory;import org.apache.lucene.util.Version;public class PageSearch { private static IndexReader reader=null; public static IndexSearcher getSearcher(Directory directory) { try {reader=IndexReader.open(directory);} catch (CorruptIndexException e) {e.printStackTrace();} catch (IOException e){e.printStackTrace();} return(new IndexSearcher(reader)); } //分页查询 public void searchPage(String query,int pageIndex,int pageSize) { try { Directory dir=PageIndex.getDirectory(); IndexSearcher searcher=getSearcher(dir); //默认搜索域为content QueryParser parser=new QueryParser(Version.LUCENE_36,"content", new StandardAnalyzer(Version.LUCENE_36)); //创建 Query Query q=parser.parse(query); TopDocs tds=searcher.search(q,200); ScoreDoc[] sd=tds.scoreDocs; //分页显示,start为每页第一个索引,end是最后一个索引,pagesize是每页显示条数,pageindex是第几页 int start=(pageIndex-1)*pageSize; int end=pageIndex*pageSize; for(int i=start;i<end;i++) { Document document=searcher.doc(sd[i].doc); System.out.println(sd[i].doc+"-->"+document.get("path")+"-->" +document.get("filename"));} searcher.close();} catch (ParseException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} } //不分页查询 public void searchNoPage(String query) { try { Directory dir=PageIndex.getDirectory(); IndexSearcher searcher=getSearcher(dir); QueryParser parser=new QueryParser(Version.LUCENE_36,"content", new StandardAnalyzer(Version.LUCENE_36)); Query q=parser.parse(query); TopDocs tds=searcher.search(q, 200); ScoreDoc[] sd=tds.scoreDocs; for(int i=0;i<sd.length;i++) { Document document=searcher.doc(sd[i].doc); System.out.println(sd[i].doc+"-->"+document.get("path")+"-->" +document.get("filename"));} searcher.close();} catch (ParseException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} } //After查询 public void searchPageByAfter(String query,int pageIndex,int pageSize) { try { Directory dir=PageIndex.getDirectory(); IndexSearcher searcher=getSearcher(dir); QueryParser parser=new QueryParser(Version.LUCENE_36,"content", new StandardAnalyzer(Version.LUCENE_36)); Query q=parser.parse(query); //获取最后一次搜索的最后一个元素 ScoreDoc lastSdDoc=getLastScoreDoc(q, pageIndex, pageSize, searcher); //将所有结果储存在内存中 TopDocs tds=searcher.searchAfter(lastSdDoc,q,pageSize);// //将所有结果储存在内存中// TopDocs tds=searcher.search(q, 200);// ScoreDoc[] sd=tds.scoreDocs;// //从上次搜索的最后一个开始,索引从零开始// int last=(pageIndex-1)*pageSize-1;// tds=searcher.searchAfter(sd[last],q, 5); for(ScoreDoc sds:tds.scoreDocs) { Document document=searcher.doc(sds.doc); System.out.println(sds.doc+"-->"+document.get("path")+"-->" +document.get("filename"));} searcher.close();} catch (ParseException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} } //获取最后一次搜索的最后一个元素 public ScoreDoc getLastScoreDoc(Query query,int pageIndex,int pageSize,IndexSearcher searcher) { if(pageIndex==1) { return null; } int num=(pageIndex-1)*pageSize; TopDocs tds = null;try {tds = searcher.search(query, num);} catch (IOException e) {e.printStackTrace();}return tds.scoreDocs[num-1]; }}package Java.se.lucene;//测试类import org.junit.Before;import org.junit.Test;public class Test_Page {private static PageIndex pi=null;private static PageSearch ps=null;@Beforepublic void init(){ pi=new PageIndex(); ps=new PageSearch();}@Testpublic void test_pageindex(){pi.Index(true);}@Testpublic void test_pagesearch01(){ps.searchPage("java",3,5);System.out.println("---------------------------");//ps.searchNoPage("java");ps.searchPageByAfter("java",3,5);}@Testpublic void test_pagesearch02(){ps.searchPageByAfter("java",3, 5);}}