`
忧里修斯
  • 浏览: 432512 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

全文检索保存在文件中的数据——简单实例

阅读更多
1、创建索引

package com.dream.index;

import java.io.BufferedReader;
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.standard.StandardAnalyzer;
import org.apache.lucene.demo.html.HTMLParser;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import org.htmlparser.Parser;


/**
 * 索引管理器
 * 为资源建立索引
 */
public class IndexMgr {
	
	private  String dataDir = "";//资源所在目录
	private  String indexDir = "";//索引文件所在目录
	
	public IndexMgr(){}
	
	/**
	 * 
	 * @param dataDir 要索引的资源所在目录
	 * @param indexDir 索引文件所在目录
	 */
	public IndexMgr(String dataDir,String indexDir){
		this.dataDir = dataDir;
		this.indexDir = indexDir;
	}
	
	/**
	 * 创建索引
	 * @throws IOException 
	 * @throws InterruptedException 
	 */
	public boolean createIndex() throws IOException, InterruptedException{
		
//		if(isIndexExist()){//若索引已经存在
//			return true;
//		}
		File dir = new File(dataDir);
		if(!dir.exists()){
			return false;
		}
		
		File[] htmls = dir.listFiles();
		//索引文件存放的位置
		//Directory fsDirectory = FSDirectory.getDirectory(indexDir, true);
		//分析器
		Analyzer analyzer = new StandardAnalyzer();
		//负责将Document写入索引文件
		IndexWriter indexWriter = new IndexWriter(this.indexDir,analyzer,true);
		
		for (int i = 0; i < htmls.length; i++) {
			String htmlPath = htmls[i].getAbsolutePath();
			
				addDocument(htmlPath, indexWriter);

		}
		indexWriter.optimize();
		indexWriter.close();
		return true;
	}
	
	/**
	 * 将Document写入索引文件
	 * @throws InterruptedException 
	 * @throws IOException 
	 */
	public void addDocument(String filePath,IndexWriter indexWriter) throws IOException, InterruptedException{
		
		String content = readFileByLines(filePath);
		Document document = new Document();
		document.add(new Field("title",content,Field.Store.YES,Field.Index.TOKENIZED));
		indexWriter.addDocument(document);
	}
	
	public String readFileByLines(String fileName){
		   File file = new File(fileName);
		   BufferedReader reader = null;
		   StringBuffer retString = new StringBuffer();
		   try {
		    reader = new BufferedReader(new FileReader(file));
		    String tempString = null;
		    int line = 1;
		    //һ�ζ���һ�У�ֱ������nullΪ�ļ�����
		    while ((tempString = reader.readLine()) != null){
		     //��ʾ�к�
		     retString.append(tempString);
		     retString.append("\n");
		     line++;
		    }
		    reader.close();
		   } catch (IOException e) {
		    e.printStackTrace();
		   } finally {
		    if (reader != null){
		     try {
		      reader.close();
		     } catch (IOException e1) {
		     }
		    }
		   }
		   
		   return retString.toString(); 
		   
	}
	
	/**
	 * 判断索引是否已存在
	 * @param indexDir 索引所在路径
	 */
	public boolean isIndexExist(){
		File directory = new File(indexDir);
		if(directory.listFiles().length > 0){
			return true;
		}else{
			return false;
		}
	}

	public String getDataDir() {
		return dataDir;
	}

	public void setDataDir(String dataDir) {
		this.dataDir = dataDir;
	}

	public String getIndexDir() {
		return indexDir;
	}

	public void setIndexDir(String indexDir) {
		this.indexDir = indexDir;
	}
}


2、执行搜索

package com.dream.index;

import java.io.BufferedReader;
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.standard.StandardAnalyzer;
import org.apache.lucene.demo.html.HTMLParser;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import org.htmlparser.Parser;


/**
 * 索引管理器
 * 为资源建立索引
 */
public class IndexMgr {
	
	private  String dataDir = "";//资源所在目录
	private  String indexDir = "";//索引文件所在目录
	
	public IndexMgr(){}
	
	/**
	 * 
	 * @param dataDir 要索引的资源所在目录
	 * @param indexDir 索引文件所在目录
	 */
	public IndexMgr(String dataDir,String indexDir){
		this.dataDir = dataDir;
		this.indexDir = indexDir;
	}
	
	/**
	 * 创建索引
	 * @throws IOException 
	 * @throws InterruptedException 
	 */
	public boolean createIndex() throws IOException, InterruptedException{
		
//		if(isIndexExist()){//若索引已经存在
//			return true;
//		}
		File dir = new File(dataDir);
		if(!dir.exists()){
			return false;
		}
		
		File[] htmls = dir.listFiles();
		//索引文件存放的位置
		//Directory fsDirectory = FSDirectory.getDirectory(indexDir, true);
		//分析器
		Analyzer analyzer = new StandardAnalyzer();
		//负责将Document写入索引文件
		IndexWriter indexWriter = new IndexWriter(this.indexDir,analyzer,true);
		
		for (int i = 0; i < htmls.length; i++) {
			String htmlPath = htmls[i].getAbsolutePath();
			
				addDocument(htmlPath, indexWriter);

		}
		indexWriter.optimize();
		indexWriter.close();
		return true;
	}
	
	/**
	 * 将Document写入索引文件
	 * @throws InterruptedException 
	 * @throws IOException 
	 */
	public void addDocument(String filePath,IndexWriter indexWriter) throws IOException, InterruptedException{
		
		String content = readFileByLines(filePath);
		Document document = new Document();
		document.add(new Field("title",content,Field.Store.YES,Field.Index.TOKENIZED));
		indexWriter.addDocument(document);
	}
	
	public String readFileByLines(String fileName){
		   File file = new File(fileName);
		   BufferedReader reader = null;
		   StringBuffer retString = new StringBuffer();
		   try {
		    reader = new BufferedReader(new FileReader(file));
		    String tempString = null;
		    int line = 1;
		    //һ�ζ���һ�У�ֱ������nullΪ�ļ�����
		    while ((tempString = reader.readLine()) != null){
		     //��ʾ�к�
		     retString.append(tempString);
		     retString.append("\n");
		     line++;
		    }
		    reader.close();
		   } catch (IOException e) {
		    e.printStackTrace();
		   } finally {
		    if (reader != null){
		     try {
		      reader.close();
		     } catch (IOException e1) {
		     }
		    }
		   }
		   
		   return retString.toString(); 
		   
	}
	
	/**
	 * 判断索引是否已存在
	 * @param indexDir 索引所在路径
	 */
	public boolean isIndexExist(){
		File directory = new File(indexDir);
		if(directory.listFiles().length > 0){
			return true;
		}else{
			return false;
		}
	}

	public String getDataDir() {
		return dataDir;
	}

	public void setDataDir(String dataDir) {
		this.dataDir = dataDir;
	}

	public String getIndexDir() {
		return indexDir;
	}

	public void setIndexDir(String indexDir) {
		this.indexDir = indexDir;
	}
}


3、控制器

package com.dream.servlet;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import sun.rmi.server.Dispatcher;

import com.dream.index.IndexMgr;
import com.dream.search.SearchMgr;

public class ToSearch extends HttpServlet {

	public ToSearch() {
		super();
	}

	public void destroy() {
		super.destroy();
	}

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doPost(request, response);
	}

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		String keyword = request.getParameter("keyword");
		List searchResult = new ArrayList();
		SearchMgr searchMgr = new SearchMgr(keyword);
		IndexMgr indexMgr = new IndexMgr();
		//设置要搜索的资源所在目录
		indexMgr.setDataDir("D:\\dataDir");
		//设置索引存放的目录
		indexMgr.setIndexDir("D:\\indexDir");
		searchMgr.setIndexMgr(indexMgr);
		searchResult = searchMgr.search();
		request.setAttribute("searchResult", searchResult);
		RequestDispatcher rdp = request.getRequestDispatcher("index.jsp");
		rdp.forward(request, response);
		
	}


	public void init() throws ServletException {
	}
	
}
分享到:
评论

相关推荐

    PHP实例开发源码——迷魂记多用户留言本PHP+TXT.zip

    在本实例中,PHP将负责接收用户提交的数据,处理这些数据,并将其存储到TXT文件中,以实现简单的数据持久化。 1. **用户认证与登录系统**:在多用户系统中,通常需要一个用户认证机制。在“迷魂记”留言本中,可能...

    西文图书管理系统——MFC编程实例

    《西文图书管理系统——MFC编程实例》是一个利用MFC(Microsoft Foundation Classes)框架在VC++6.0环境下开发的应用程序。MFC是微软提供的一种C++类库,它为Windows应用程序开发提供了丰富的接口和功能,极大地简化...

    安卓Android源码——数据口袋.zip

    "安卓Android源码——数据口袋.zip"可能包含的是关于Android系统中数据管理、存储和检索方面的源代码示例或者工具集。在这个压缩包中,重点是"数据口袋"这一概念,它可能是对数据管理模块的一个形象化的称呼,用于...

    文件(word,txt...)保存到sql server

    在IT行业中,将文件如Word文档或TXT文本存储到SQL Server数据库是一项常见的需求,这有助于集中管理和检索数据。本文将详细讲解如何实现这一操作,主要针对Visual Studio 2003和2005这两个开发环境。 首先,我们...

    PHP开发实战1200例(第1卷).(清华出版.潘凯华.刘中华).part2

    实例244 将文本文件中数据存储到数据库中 316 4.5 文件的压缩与解压 318 实例245 PHP中压缩RAR文件 319 实例246 PHP中将上传文件转换成RAR文件 320 实例247 PHP中对RAR文件进行解压 321 实例248 PHP中压缩ZIP文件 ...

    全文检索技术 lucene(二) 自己动手写一个搜索引擎

    全文检索技术是互联网信息检索的一种核心手段,它允许用户输入自然语言查询,并在大量文本数据中找到相关的文档。Lucene作为Java开发的全文检索库,为开发者提供了高效、灵活的工具来实现这一目标。 首先,我们需要...

    C++实例——考试管理系统

    在本C++实例中,我们将探讨如何构建一个考试管理系统,这是一个常见的软件开发任务,它能够帮助教育机构自动化处理考试相关的各种事务。C++作为一种强大的、面向对象的编程语言,非常适合用于构建这种系统,因为它...

    PHP开发实战1200例(第1卷).(清华出版.潘凯华.刘中华).part1

    实例244 将文本文件中数据存储到数据库中 316 4.5 文件的压缩与解压 318 实例245 PHP中压缩RAR文件 319 实例246 PHP中将上传文件转换成RAR文件 320 实例247 PHP中对RAR文件进行解压 321 实例248 PHP中压缩ZIP文件 ...

    PHP实例开发源码——邮箱LOGO在线制作php版.zip

    4. **数据库交互**:如果项目允许用户保存或检索他们的LOGO设计,那么很可能使用了数据库存储LOGO的元数据。PHP可能通过PDO(PHP Data Objects)或MySQLi扩展与数据库进行连接和交互。 5. **前端界面**:项目前端...

    ASP网站实例开发源码——深圳彩格新电子有限公司整站(源码+数据库).zip

    此实例中的数据库部分可能包含产品信息、用户数据、订单记录等,开发者可以通过ASP连接到数据库,执行查询、插入、更新和删除操作。例如,用户登录时,ASP脚本会验证用户名和密码,这需要从数据库检索用户信息;在...

    ASP网站实例开发源码——抗震办网站整站.rar

    在这个实例中,我们可以看到如何创建SQL查询,连接到数据库,读取、插入或更新数据。抗震办网站可能需要存储和检索关于地震信息、救援行动、政策法规等内容。 4. **session和cookie管理**:ASP支持session和cookie...

    ASP网站实例开发源码——网络科技有限公司全站程序(源码+数据库).rar

    这个压缩包文件“ASP网站实例开发源码——网络科技有限公司全站程序(源码+数据库).rar”包含了用于创建一个完整的网络科技公司网站的源代码和相关的数据库资源。 源码是开发者的智慧结晶,它揭示了网站如何工作,...

    iOS实例开发源码——knowuh-Flake-Saver-73c02eb.zip

    《iOS实例开发源码——knowuh-Flake-Saver-73c02eb》 在iOS应用开发中,源代码是理解一个项目的核心。"knowuh-Flake-Saver-73c02eb.zip"这个压缩包包含了iOS实例项目"Flake-Saver"的源码,该实例可能是一个用于保存...

    C#全能速查宝典

    《C#全能速查宝典》共分为8章,分别介绍了C#语言基础、Windows窗体及常用控件、Windows高级控件、控件公共属性、方法及事件、数据库开发、文件、数据流与注册表、GDI+绘图技术和C#高级编程,共包含562个C#编程中常用...

    ASP网站实例开发源码——泸州网上售楼系统.zip

    分析源码可以帮助我们理解每个文件的作用,例如,`.asp`文件可能包含业务逻辑,`.inc`文件可能存储了常用的函数和变量,而`.mdb`或`.sql`文件则可能包含了数据库结构和数据。 总的来说,"ASP网站实例开发源码——...

    PHP论坛社区类网站实例开发源码——Phpwind会员电子邮件地址导出程序.zip

    通过学习和理解这个源码实例,开发者不仅可以掌握如何在PHP环境中与数据库交互、处理文件和用户权限,还能了解到实际项目中的安全实践,这对于提升PHP开发技能和经验大有裨益。同时,对于想要深入了解社区论坛开发或...

    ASP实例开发源码——嵩嵩报名系统2020 asp源码.zip

    在ASP实例开发源码——嵩嵩报名系统2020 asp源码.zip这个压缩包中,我们可以深入理解ASP技术在实际应用中的运用,特别是构建一个在线报名系统的流程和方法。 1. **ASP基础**: ASP是基于HTML的,它允许开发者在...

    ASP网站实例开发源码——旅游机票订购网站系统源代码.zip

    Cookie可以在客户端保存信息,而隐藏字段则可以将数据嵌入在HTTP请求中,两者都可以在用户页面间传递数据。 7. **URL重写**:为了提高用户体验和SEO友好性,开发者可能使用了URL重写技术,使复杂的ASP请求看起来像...

Global site tag (gtag.js) - Google Analytics