`
iamcrzay
  • 浏览: 57593 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

Lucene初探,一个初级的LuceneDemo

阅读更多
公司的项目要用到全文检索所以不得不花些时间来看看,在看了几天的文档之后自己尝试着做出了这样的一个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(完整代码)

    "luceneDemo(完整代码)"是一个实践项目,旨在帮助开发者深入理解Lucene的基础类运用、高亮器实现以及相关度排序等核心概念。 首先,我们来看看基础类的运用。在Lucene中,IndexWriter是创建和更新索引的主要类,...

    luceneDemo

    在 "luceneDemo" 中,可能包含了一个简单的 Lucene 应用示例,比如: - `search.jsp`: 这是一个 JSP 文件,通常用于接收用户输入的查询字符串,然后调用后端服务进行搜索。 - `WEB-INF`: 这个目录在 Java Web 应用...

    简单的lucene demo

    Lucene是一个强大的全文搜索引擎库,由Apache软件基金会开发并维护,它在Java编程语言中实现,广泛应用于各种搜索应用的构建。这个“简单的lucene demo”旨在向我们展示如何利用Lucene进行基础的文本索引和搜索操作...

    LuceneDemo

    总结,Lucene是一个强大且灵活的全文检索库,它不仅提供了核心的搜索功能,还允许开发者通过定制化实现各种复杂的搜索需求。在实际项目中,结合如Solr或Elasticsearch这样的高级搜索服务器,可以构建出更强大的企业...

    Lucene3.3.0学习Demo

    **Lucene 3.3.0 学习Demo** ...总之,"Lucene3.3.0学习Demo"是一个宝贵的资源,对于想要掌握全文搜索技术的开发者来说,它提供了丰富的实践案例和学习材料,可以帮助你快速上手并深入理解Lucene的核心机制。

    Lucene-Demo.rar Lucene分词的demo

    这个名为"Lucene-Demo.rar"的压缩包提供了一个基于Lucene的分词演示项目,可以帮助开发者快速理解和应用Lucene的分词功能。在这个压缩包中,有两个主要的文件:`lucene`目录和`Lucene-Demo`文件。 `lucene`目录很...

    lucene Demo(paoding)

    【Lucene Demo (Paoding)】是一个展示如何在Java环境中使用Apache Lucene库进行全文搜索引擎构建的示例项目。Lucene是开源的全文检索引擎库,它提供了强大的文本搜索功能,而Paoding则是针对中文处理的插件,优化了...

    lucene简单demo

    在"LuceneDemo"这个项目中,你可以期待看到一个简单的Java程序,它将演示上述过程,可能包括创建一个或多个包含文本数据的Document,使用默认的StandardAnalyzer建立索引,然后执行一个基本的文本查询,展示搜索结果...

    Lucene常用的Demo

    Lucene是一个开源的全文搜索引擎库,由Apache软件基金会开发并维护。它提供了文本分析、索引构建、搜索功能的核心工具,是Java开发者在项目中实现全文检索的重要利器。本篇文章将深入探讨Lucene的几个常见示例,包括...

    全文搜索技术Lucene Demo

    本篇文章将深入探讨Lucene的核心概念、工作原理以及如何通过一个Demo来实践它的使用。 Lucene的主要功能包括索引构建、查询解析、评分和结果排序。索引构建是将原始文本数据转换成一种高效的数据结构,以便于快速...

    lucene5的一个简单Demo

    在这个“lucene5的一个简单Demo”中,我们将深入探讨如何使用 Lucene 5.x 版本进行基本的全文搜索引擎的构建。 首先,我们需要理解 Lucene 的核心概念。Lucene 的工作流程主要包括以下步骤: 1. **创建索引**:这...

    jsuop+lucene demo

    在"jsuop+lucene demo"项目中,这两个工具被结合使用,以实现一个简单的新闻爬虫系统,并在此基础上构建了全文索引查询功能,便于用户快速、准确地查找所需新闻内容。 **一、新闻爬虫** 1. **网络爬虫基础**:网络...

    lucene_demo例子

    Lucene是一个全文搜索引擎库,它提供了强大的文本搜索功能,被广泛应用于各种信息检索系统中。这本书详细介绍了Lucene的核心概念、API以及实际应用案例,帮助读者快速理解和掌握Lucene的使用。 在"lucene_demo"这个...

    LuceneDemo.zip

    首先,我们要明确的是,"LuceneDemo.zip"是一个包含了Lucene实例的压缩文件。通过解压并运行其中的项目,我们可以亲身体验Lucene如何在实际应用中工作。这通常包括以下几个步骤: 1. **本地加工,建立索引库**:在...

    lucene for java 简单demo

    Lucene 是一个全文搜索引擎库,由Apache软件基金会开发并维护,它提供了一个高效、可扩展的搜索框架,使得开发者可以轻易地在自己的应用程序中集成全文检索功能。Java是Lucene的主要支持语言,因此"Lucene for Java...

    Lucene简单Demo(附带Jar)

    "luceneDemo1"可能是一个包含Lucene应用示例的Java项目,包含了必要的类和方法,展示了如何使用Lucene进行全文搜索。而"lucene"可能是一个索引目录,存储了已经被Lucene处理过的数据,用于搜索操作。 **总结** ...

    SpringBoot+Lucene搜索结果高亮显示Demo

    这个SpringBoot+Lucene的Demo为开发者提供了一个起点,可以在此基础上进一步扩展,比如增加对多字段的索引和搜索、支持多种类型的文档、优化查询性能等。通过熟练掌握这些知识,你可以构建出更加强大的全文搜索引擎...

Global site tag (gtag.js) - Google Analytics