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搜索分页过程中,可以有两种方式 一种是将搜索结果集直接放到session中,但是假如结果集非常大,同时又存在大并发访问的时候,很可能造成服务器的内存不足,而使服务器宕机 还有一种是每次都重新进行搜索,这样...
本文将深入探讨"Lucene5学习之分页查询"这一主题,结合给定的标签"源码"和"工具",我们将讨论如何在Lucene5中实现高效的分页查询,并探讨其背后的源码实现。 首先,理解分页查询的重要性是必要的。在大型数据集的...
在搜索引擎和信息检索系统中,Lucene是一个非常关键的开源全文...总结来说,Lucene的排序、过滤和分页是构建高效搜索系统的关键技术。通过对这些概念的深入理解和实践,开发者可以构建出满足用户需求的高性能搜索引擎。
总之,利用Lucene的`IndexSearcher`和适当的分页策略,我们可以高效地处理大量数据的搜索请求。这个过程不仅提高了用户体验,也优化了服务器性能。记得在实践中不断调整和优化查询参数,以适应具体的应用场景。
lucene实例是一个比较详细的例子,包括lucene的入门到高级实例,代码里有比较详细的实例,所有的实例都是通过junit来测试...实例包括各种搜索:如通配符查询、模糊查询、查询结果的分页、中文分词器、自定义分词器等...
SSH + Lucene + 分页 + 排序 + 高亮 模拟简单新闻网站搜索引擎--NewsWithSearch.part3 SSH + Lucene + 分页 + 排序 + 高亮 模拟简单新闻网站搜索引擎--NewsWithSearch.part2 SSH + Lucene + 分页 + 排序 + 高亮 ...
综上所述,这个项目展示了如何利用SSH框架与Lucene搜索引擎技术,实现一个功能完备的新闻搜索系统,包括高效搜索、结果排序、分页展示以及关键词高亮等特性。这样的系统对于提升新闻网站的用户体验具有重要意义。
本压缩包中的代码着重展示了如何使用 Lucene 进行分页搜索和结果高亮显示。下面将详细解释这两个关键知识点。 **一、Lucene 分页搜索** 在大型数据集上进行搜索时,一次性返回所有结果并不实际,因此分页搜索显得...
Lucene 提供了强大的文本分析、索引创建、文档检索以及搜索结果排序等功能。在 .NET 平台上,Lucene.net 提供了与原生 Lucene 相同的强大功能,并且完全兼容 .NET Framework 和 .NET Core。 1. **文本分析(Text ...
SSH + Lucene + 分页 + 排序 + 高亮 模拟简单新闻网站搜索引擎--NewsWithSearch.part3 SSH + Lucene + 分页 + 排序 + 高亮 模拟简单新闻网站搜索引擎--NewsWithSearch.part2 SSH + Lucene + 分页 + 排序 + 高亮 ...
本篇文章将带你迈出使用Lucene的第一步,重点关注如何实现分页检索,这对于构建高效、用户友好的搜索系统至关重要。 Lucene的核心功能包括文档索引、查询解析和结果排序。在分页检索方面,我们需要考虑如何有效地...
标题中的“使用Lucene4.7实现搜索功能,分页+高亮”表明我们要讨论的是如何利用Apache Lucene 4.7版本来构建一个具备搜索、分页和高亮显示功能的系统。Lucene是一个高性能、全文本搜索引擎库,它提供了强大的文本...
SSH + Lucene + 分页 + 排序 + 高亮 模拟简单新闻网站搜索引擎--NewsWithSearch.part3 SSH + Lucene + 分页 + 排序 + 高亮 模拟简单新闻网站搜索引擎--NewsWithSearch.part2 SSH + Lucene + 分页 + 排序 + 高亮 ...
在IT行业中,搜索引擎技术起着至关重要的作用,而Apache Lucene是其中的佼佼者,它是一个开源的全文检索库,被广泛应用于构建高效的搜索功能。这篇博客文章“对内存中Lucene查询的集合进行分页”探讨的是如何在处理...
SSH + Lucene + 分页 + 排序 + 高亮 模拟简单新闻网站搜索引擎--NewsWithSearch.part3 SSH + Lucene + 分页 + 排序 + 高亮 模拟简单新闻网站搜索引擎--NewsWithSearch.part2 SSH + Lucene + 分页 + 排序 + 高亮 ...
SSH + Lucene + 分页 + 排序 + 高亮 模拟简单新闻网站搜索引擎--NewsWithSearch.part3 SSH + Lucene + 分页 + 排序 + 高亮 模拟简单新闻网站搜索引擎--NewsWithSearch.part2 SSH + Lucene + 分页 + 排序 + 高亮 ...
SSH + Lucene + 分页 + 排序 + 高亮 模拟简单新闻网站搜索引擎--NewsWithSearch.part3 SSH + Lucene + 分页 + 排序 + 高亮 模拟简单新闻网站搜索引擎--NewsWithSearch.part2 SSH + Lucene + 分页 + 排序 + 高亮 ...
在本系统中,我们利用SpringMVC的模型绑定功能,结合Lucene和MyBatis的查询能力,实现了基于关键词的文档搜索结果的分页显示。用户可以通过指定页码和每页条目数量来浏览搜索结果,系统会动态地计算总页数并加载相应...
这个"lucene检索小例子"程序展示了如何利用Lucene的强大功能来构建索引和执行搜索操作。Lucene的核心特性包括文本分析、索引创建、查询解析以及高效的搜索算法,使得开发者能够轻松地在大量文本数据中实现快速、准确...