`
smallearth
  • 浏览: 37452 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

Lucene小练十二(分页搜索)

 
阅读更多
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));//添加Name
				doc.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;
	@Before
	public void init()
	{
		 pi=new PageIndex();
	     ps=new PageSearch();
	}
	@Test
	public void test_pageindex()
	{
		pi.Index(true);
	}
	@Test
	public void test_pagesearch01()
	{
		ps.searchPage("java",3,5);
		System.out.println("---------------------------");
		//ps.searchNoPage("java");
		ps.searchPageByAfter("java",3,5);
	}
	@Test
	public void test_pagesearch02()
	{
		ps.searchPageByAfter("java",3, 5);
	}
	


}
 


分享到:
评论

相关推荐

    lucene查询结果集分页代码

    在lucene搜索分页过程中,可以有两种方式 一种是将搜索结果集直接放到session中,但是假如结果集非常大,同时又存在大并发访问的时候,很可能造成服务器的内存不足,而使服务器宕机 还有一种是每次都重新进行搜索,这样...

    Lucene5学习之分页查询

    本文将深入探讨"Lucene5学习之分页查询"这一主题,结合给定的标签"源码"和"工具",我们将讨论如何在Lucene5中实现高效的分页查询,并探讨其背后的源码实现。 首先,理解分页查询的重要性是必要的。在大型数据集的...

    lucene的排序过滤和分页.zip

    在搜索引擎和信息检索系统中,Lucene是一个非常关键的开源全文...总结来说,Lucene的排序、过滤和分页是构建高效搜索系统的关键技术。通过对这些概念的深入理解和实践,开发者可以构建出满足用户需求的高性能搜索引擎。

    lucene查询工具类和IndexSearcher分页查询示例

    总之,利用Lucene的`IndexSearcher`和适当的分页策略,我们可以高效地处理大量数据的搜索请求。这个过程不仅提高了用户体验,也优化了服务器性能。记得在实践中不断调整和优化查询参数,以适应具体的应用场景。

    lucene实例(包括分页、中文检索等)

    lucene实例是一个比较详细的例子,包括lucene的入门到高级实例,代码里有比较详细的实例,所有的实例都是通过junit来测试...实例包括各种搜索:如通配符查询、模糊查询、查询结果的分页、中文分词器、自定义分词器等...

    SSH + Lucene + 分页 + 排序 + 高亮 模拟简单新闻网站搜索引擎--dic

    SSH + Lucene + 分页 + 排序 + 高亮 模拟简单新闻网站搜索引擎--NewsWithSearch.part3 SSH + Lucene + 分页 + 排序 + 高亮 模拟简单新闻网站搜索引擎--NewsWithSearch.part2 SSH + Lucene + 分页 + 排序 + 高亮 ...

    SSH + Lucene + 分页 + 排序 + 高亮 模拟简单新闻网站搜索引擎--data

    综上所述,这个项目展示了如何利用SSH框架与Lucene搜索引擎技术,实现一个功能完备的新闻搜索系统,包括高效搜索、结果排序、分页展示以及关键词高亮等特性。这样的系统对于提升新闻网站的用户体验具有重要意义。

    自己写的lucene分页高亮显示代码

    本压缩包中的代码着重展示了如何使用 Lucene 进行分页搜索和结果高亮显示。下面将详细解释这两个关键知识点。 **一、Lucene 分页搜索** 在大型数据集上进行搜索时,一次性返回所有结果并不实际,因此分页搜索显得...

    Lucene.net建立索引,检索分页Demo

    Lucene 提供了强大的文本分析、索引创建、文档检索以及搜索结果排序等功能。在 .NET 平台上,Lucene.net 提供了与原生 Lucene 相同的强大功能,并且完全兼容 .NET Framework 和 .NET Core。 1. **文本分析(Text ...

    SSH + Lucene + 分页 + 排序 + 高亮 模拟简单新闻网站搜索引擎--news.part2

    SSH + Lucene + 分页 + 排序 + 高亮 模拟简单新闻网站搜索引擎--NewsWithSearch.part3 SSH + Lucene + 分页 + 排序 + 高亮 模拟简单新闻网站搜索引擎--NewsWithSearch.part2 SSH + Lucene + 分页 + 排序 + 高亮 ...

    lucene第一步---6.分页

    本篇文章将带你迈出使用Lucene的第一步,重点关注如何实现分页检索,这对于构建高效、用户友好的搜索系统至关重要。 Lucene的核心功能包括文档索引、查询解析和结果排序。在分页检索方面,我们需要考虑如何有效地...

    使用Lucene4.7实现搜索功能,分页+高亮

    标题中的“使用Lucene4.7实现搜索功能,分页+高亮”表明我们要讨论的是如何利用Apache Lucene 4.7版本来构建一个具备搜索、分页和高亮显示功能的系统。Lucene是一个高性能、全文本搜索引擎库,它提供了强大的文本...

    SSH + Lucene + 分页 + 排序 + 高亮 模拟简单新闻网站搜索引擎--NewsWithSearch.part1

    SSH + Lucene + 分页 + 排序 + 高亮 模拟简单新闻网站搜索引擎--NewsWithSearch.part3 SSH + Lucene + 分页 + 排序 + 高亮 模拟简单新闻网站搜索引擎--NewsWithSearch.part2 SSH + Lucene + 分页 + 排序 + 高亮 ...

    对内存中Lucene查询的集合进行分页

    在IT行业中,搜索引擎技术起着至关重要的作用,而Apache Lucene是其中的佼佼者,它是一个开源的全文检索库,被广泛应用于构建高效的搜索功能。这篇博客文章“对内存中Lucene查询的集合进行分页”探讨的是如何在处理...

    SSH + Lucene + 分页 + 排序 + 高亮 模拟简单新闻网站搜索引擎--NewsWithSearch.part2

    SSH + Lucene + 分页 + 排序 + 高亮 模拟简单新闻网站搜索引擎--NewsWithSearch.part3 SSH + Lucene + 分页 + 排序 + 高亮 模拟简单新闻网站搜索引擎--NewsWithSearch.part2 SSH + Lucene + 分页 + 排序 + 高亮 ...

    SSH + Lucene + 分页 + 排序 + 高亮 模拟简单新闻网站搜索引擎--NewsWithSearch.part3

    SSH + Lucene + 分页 + 排序 + 高亮 模拟简单新闻网站搜索引擎--NewsWithSearch.part3 SSH + Lucene + 分页 + 排序 + 高亮 模拟简单新闻网站搜索引擎--NewsWithSearch.part2 SSH + Lucene + 分页 + 排序 + 高亮 ...

    SSH + Lucene + 分页 + 排序 + 高亮 模拟简单新闻网站搜索引擎--news.part1

    SSH + Lucene + 分页 + 排序 + 高亮 模拟简单新闻网站搜索引擎--NewsWithSearch.part3 SSH + Lucene + 分页 + 排序 + 高亮 模拟简单新闻网站搜索引擎--NewsWithSearch.part2 SSH + Lucene + 分页 + 排序 + 高亮 ...

    springmvc+mybatis+lucene4文档搜索系统(支持分页)

    在本系统中,我们利用SpringMVC的模型绑定功能,结合Lucene和MyBatis的查询能力,实现了基于关键词的文档搜索结果的分页显示。用户可以通过指定页码和每页条目数量来浏览搜索结果,系统会动态地计算总页数并加载相应...

    lucene检索小例子

    这个"lucene检索小例子"程序展示了如何利用Lucene的强大功能来构建索引和执行搜索操作。Lucene的核心特性包括文本分析、索引创建、查询解析以及高效的搜索算法,使得开发者能够轻松地在大量文本数据中实现快速、准确...

Global site tag (gtag.js) - Google Analytics