公司的项目要用到全文检索所以不得不花些时间来看看,在看了几天的文档之后自己尝试着做出了这样的一个Demo
我们要实现的目标是,上传文件并且对上传文件的内容进行检索,检索的结果是文件名,上传时间,内容摘要。
首先给出Demo所用到的技术:
webwork+freemarker ,Lucene的版本事2.4最新版,在此中我们用到了dom4j最终的搜索的结果生成的是一个xml文件,然后用xslt格式化输出。
首先给出的是wobwork的配置文件xwork.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE xwork PUBLIC "-//OpenSymphony Group//XWork 1.1.1//EN" "http://www.opensymphony.com/xwork/xwork-1.1.1.dtd">
<xwork>
<include file="webwork-default.xml"/>
<package name="main" extends="webwork-default">
<action name="main" class="com.fengzhong.webLucene.action.MainAction">
<result name="success" type="freemarker">
/WEB-INF/ftl/index.ftl
</result>
<result name="error" type="freemarker">
/WEB-INF/ftl/error.ftl
</result>
</action>
<action name="fileUpload" class="com.fengzhong.webLucene.action.FileUploadAction">
<result name="success" type="freemarker">
/WEB-INF/ftl/success.ftl
</result>
<result name="input" type="freemarker">
/WEB-INF/ftl/fileUpload.ftl
</result>
<result name="error" type="freemarker">
/WEB-INF/ftl/error.ftl
</result>
</action>
<action name="search" class="com.fengzhong.webLucene.action.SearchAction">
<result name="success">
/WEB-INF/resultSet.xml
</result>
<result name="input" type="freemarker">
/WEB-INF/ftl/search.ftl
</result>
</action>
</package>
</xwork>
文件上传处理的action:
FileUploadAction
package org.john.webLucene.action;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.channels.FileChannel;
import java.util.Date;
import org.john.webLucene.lucene.IndexUtil;
import org.john.webLucene.utils.DateUtil;
import com.opensymphony.xwork.ActionSupport;
public class FileUploadAction extends ActionSupport{
private File doc;
private String digest;
private String docContentType;
private String docFileName;
public String getDocContentType() {
return docContentType;
}
public void setDocContentType(String docContentType) {
this.docContentType = docContentType;
}
public String getDocFileName() {
return docFileName;
}
public void setDocFileName(String docFileName) {
this.docFileName = docFileName;
}
@Override
public String execute() throws Exception {
FileChannel srcChannel=null;
FileChannel dstChannel=null;
try {
srcChannel = new FileInputStream(doc).getChannel();
dstChannel = new FileOutputStream(new File("E:/luceneDemo/data/"+docFileName)).getChannel();
dstChannel.transferFrom(srcChannel, 0, srcChannel.size());
} catch (IOException e) {
return this.ERROR;
}
finally{
srcChannel.close();
dstChannel.close();
}
File temp=new File("E:/luceneDemo/data/"+docFileName);
if(!temp.exists()){
return this.ERROR;
}
String uploadDate=DateUtil.convertDateToString(new Date());
File data=new File("E:/luceneDemo/data/"+docFileName);
IndexUtil.createIndex(data,data.getName(), uploadDate, digest);
return this.SUCCESS;
}
public String getDigest() {
return digest;
}
public void setDigest(String digest) {
this.digest = digest;
}
public File getDoc() {
return doc;
}
public void setDoc(File doc) {
this.doc = doc;
}
}
用Lucene构建搜素应用时最重要的2件事情就是创建索引和搜索
以下给出的是索引的构建工具类IndexUtil:
package org.john.webLucene.lucene;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.cn.ChineseAnalyzer;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.index.CorruptIndexException;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.store.LockObtainFailedException;
/**
*
* @author John
*
*
*/
public class IndexUtil {
/**
*
* @param data 要被建立索引的文件
* @param fileName 文件明
* @param uploadDate 上传日期
* @param digest 文件内容摘要
* @throws CorruptIndexException
* @throws LockObtainFailedException
* @throws IOException
*/
public static void createIndex(File data,String fileName,
String uploadDate,String digest)
throws CorruptIndexException, LockObtainFailedException, IOException{
File indexDir=new File("E:/luceneDemo/indexDir");
boolean isEmpty=false;
File files[]=indexDir.listFiles();
if(files.length==0){
isEmpty=true;
}
Analyzer analyzer=new ChineseAnalyzer();
IndexWriter indexWriter=new IndexWriter(indexDir,analyzer,isEmpty);
Document doc=new Document();
Reader reader=new FileReader(data);
Field f1=new Field("fileName",fileName,Field.Store.YES, Field.Index.TOKENIZED);
Field f2=new Field("uploadDate",uploadDate,Field.Store.YES, Field.Index.TOKENIZED);
Field f3=new Field("content",reader);
Field f4=new Field("digest",digest,Field.Store.YES, Field.Index.TOKENIZED);
doc.add(f1);
doc.add(f2);
doc.add(f3);
doc.add(f4);
indexWriter.addDocument(doc);
indexWriter.optimize();
indexWriter.close();
}
}
在索引构建完成之后就可以对上传文件的内容进行检索下面给出Lucene中搜索的代码
SearchUtils工具类:
public class SearchUtil {
public static Hits Search(String keyword) throws IOException, ParseException{
Hits hits=null;
File indexDir=new File("E:/luceneDemo/indexDir");
FSDirectory fsDirectory=FSDirectory.getDirectory(indexDir);
IndexSearcher indexSearch=new IndexSearcher(fsDirectory);
Analyzer analyzer=new ChineseAnalyzer();
/*Term term=new Term("content",keyword);
TermQuery query=new TermQuery(term);
hits=indexSearch.search(query);*/
QueryParser queryParser=new QueryParser("content",analyzer);
Query query=queryParser.parse(keyword);
hits=indexSearch.search(query);
return hits;
}
}
附件是工程的打的包,由于大小的限制没有加入相关引用包,请自行加入。
分享到:
相关推荐
"luceneDemo(完整代码)"是一个实践项目,旨在帮助开发者深入理解Lucene的基础类运用、高亮器实现以及相关度排序等核心概念。 首先,我们来看看基础类的运用。在Lucene中,IndexWriter是创建和更新索引的主要类,...
在 "luceneDemo" 中,可能包含了一个简单的 Lucene 应用示例,比如: - `search.jsp`: 这是一个 JSP 文件,通常用于接收用户输入的查询字符串,然后调用后端服务进行搜索。 - `WEB-INF`: 这个目录在 Java Web 应用...
Lucene是一个强大的全文搜索引擎库,由Apache软件基金会开发并维护,它在Java编程语言中实现,广泛应用于各种搜索应用的构建。这个“简单的lucene demo”旨在向我们展示如何利用Lucene进行基础的文本索引和搜索操作...
总结,Lucene是一个强大且灵活的全文检索库,它不仅提供了核心的搜索功能,还允许开发者通过定制化实现各种复杂的搜索需求。在实际项目中,结合如Solr或Elasticsearch这样的高级搜索服务器,可以构建出更强大的企业...
**Lucene 3.3.0 学习Demo** ...总之,"Lucene3.3.0学习Demo"是一个宝贵的资源,对于想要掌握全文搜索技术的开发者来说,它提供了丰富的实践案例和学习材料,可以帮助你快速上手并深入理解Lucene的核心机制。
这个名为"Lucene-Demo.rar"的压缩包提供了一个基于Lucene的分词演示项目,可以帮助开发者快速理解和应用Lucene的分词功能。在这个压缩包中,有两个主要的文件:`lucene`目录和`Lucene-Demo`文件。 `lucene`目录很...
【Lucene Demo (Paoding)】是一个展示如何在Java环境中使用Apache Lucene库进行全文搜索引擎构建的示例项目。Lucene是开源的全文检索引擎库,它提供了强大的文本搜索功能,而Paoding则是针对中文处理的插件,优化了...
在"LuceneDemo"这个项目中,你可以期待看到一个简单的Java程序,它将演示上述过程,可能包括创建一个或多个包含文本数据的Document,使用默认的StandardAnalyzer建立索引,然后执行一个基本的文本查询,展示搜索结果...
Lucene是一个开源的全文搜索引擎库,由Apache软件基金会开发并维护。它提供了文本分析、索引构建、搜索功能的核心工具,是Java开发者在项目中实现全文检索的重要利器。本篇文章将深入探讨Lucene的几个常见示例,包括...
本篇文章将深入探讨Lucene的核心概念、工作原理以及如何通过一个Demo来实践它的使用。 Lucene的主要功能包括索引构建、查询解析、评分和结果排序。索引构建是将原始文本数据转换成一种高效的数据结构,以便于快速...
在这个“lucene5的一个简单Demo”中,我们将深入探讨如何使用 Lucene 5.x 版本进行基本的全文搜索引擎的构建。 首先,我们需要理解 Lucene 的核心概念。Lucene 的工作流程主要包括以下步骤: 1. **创建索引**:这...
在"jsuop+lucene demo"项目中,这两个工具被结合使用,以实现一个简单的新闻爬虫系统,并在此基础上构建了全文索引查询功能,便于用户快速、准确地查找所需新闻内容。 **一、新闻爬虫** 1. **网络爬虫基础**:网络...
Lucene是一个全文搜索引擎库,它提供了强大的文本搜索功能,被广泛应用于各种信息检索系统中。这本书详细介绍了Lucene的核心概念、API以及实际应用案例,帮助读者快速理解和掌握Lucene的使用。 在"lucene_demo"这个...
首先,我们要明确的是,"LuceneDemo.zip"是一个包含了Lucene实例的压缩文件。通过解压并运行其中的项目,我们可以亲身体验Lucene如何在实际应用中工作。这通常包括以下几个步骤: 1. **本地加工,建立索引库**:在...
Lucene 是一个全文搜索引擎库,由Apache软件基金会开发并维护,它提供了一个高效、可扩展的搜索框架,使得开发者可以轻易地在自己的应用程序中集成全文检索功能。Java是Lucene的主要支持语言,因此"Lucene for Java...
"luceneDemo1"可能是一个包含Lucene应用示例的Java项目,包含了必要的类和方法,展示了如何使用Lucene进行全文搜索。而"lucene"可能是一个索引目录,存储了已经被Lucene处理过的数据,用于搜索操作。 **总结** ...
这个SpringBoot+Lucene的Demo为开发者提供了一个起点,可以在此基础上进一步扩展,比如增加对多字段的索引和搜索、支持多种类型的文档、优化查询性能等。通过熟练掌握这些知识,你可以构建出更加强大的全文搜索引擎...