`
gordon20082008
  • 浏览: 25490 次
  • 性别: Icon_minigender_1
  • 来自: 合肥
社区版块
存档分类
最新评论

lucene基本的搜索功能

阅读更多
对网上盛传的lucene使用方法进行了一些修改.网上的是对某个目录下所有HTML文件进行索引和搜索。但是不支持多重目录下的搜索。这里做了一点修改。大部分还是网上的代码。
Constants.java
package testlucene;

public class Constants {
        //要索引的文件的存放路径
        public final static String INDEX_FILE_PATH = "c:\\dataDir";
        
        //索引的存放位置
        public final static String INDEX_STORE_PATH = "c:\\indexDir";
}


LuceneIndex.java
package testlucene;
import java.io.*;
import java.util.*;
import org.apache.lucene.document.*;
import org.apache.lucene.index.*;
import org.mira.lucene.analysis.IK_CAnalyzer;

public class LuceneIndex {
        private IndexWriter writer = null;
        
		public LuceneIndex(){
                try {
                        writer = new IndexWriter(Constants.INDEX_STORE_PATH,new IK_CAnalyzer(),true);
                        //true表示可以重写(覆盖?)
                }catch(Exception e){
                        e.printStackTrace();
                }
        }
        
        @SuppressWarnings("deprecation")
		private Document getDocument(File f) throws Exception{
        	//为每个文件建立一个Document文档,里面增加内容
                Document doc = new Document();
                    if(f.isFile()){
                   	 FileInputStream is = new FileInputStream(f);
                        Reader reader = new BufferedReader(new InputStreamReader(is));
                        doc.add(new Field("contents",reader));
                        doc.add(new Field("path",f.getCanonicalPath(),Field.Store.YES,Field.Index.TOKENIZED));
                   }

               
                return doc;
        }
        
        public void writeToIndex() throws Exception{
                File folder = new File(Constants.INDEX_FILE_PATH);
                if(folder.isDirectory()){
                        File[] files = getFileList(new File(Constants.INDEX_FILE_PATH));
                        for(int i=0; i<files.length; i++){
                                File file = new File(files[i].toString());
                                Document doc = getDocument(file);
                                System.out.println("正在为文件   (" + file + ") 建立索引...");
                                writer.addDocument(doc);
                        }
                }
        }
        
        public void close()throws Exception{
                writer.close();
        }
        
        public static void main(String[] args)throws Exception{
                LuceneIndex indexer = new LuceneIndex();
                Date start = new Date();
                indexer.writeToIndex();
                Date end = new Date();
                System.out.println("建立索引用时 " + (end.getTime() - start.getTime()) + "毫秒");
                indexer.close();
        }
        
		@SuppressWarnings("unchecked")
		private File[] getFileList(File file){
        	File[] list = null;
        	ArrayList show = new ArrayList();
        	if(file.isFile()){list = new File[1];list[0] = file;return list;}
        	else if(file.isDirectory()){
        		File[] subDir = file.listFiles();
        		
        		for(int j=0;j<subDir.length;j++){
        			if(subDir[j].isFile()){
        				
        				 show.add(subDir[j]);
        			}else if(subDir[j].isDirectory()){
        				File[] third = getFileList(subDir[j]);
        				for(int k=0;null!=third&&k<third.length;k++)
        				show.add(third[k]);
        			}
        		}
        	}
        	list = new File[show.size()];
        	for(int m=0;m<show.size();m++)list[m]=new File(show.get(m).toString());
        	return list;
        }
        
}


package testlucene;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.InputStreamReader;
import java.io.RandomAccessFile;
import java.util.*;
import org.apache.lucene.document.*;
import org.apache.lucene.queryParser.*;
import org.apache.lucene.search.*;
import org.mira.lucene.analysis.IK_CAnalyzer;

public class LuceneSearch {
	private IndexSearcher searcher = null;
	private Query query = null;
	private  File shopInfoTxt = null;
	private RandomAccessFile bw;
	

	
	public LuceneSearch() {
		try {
			searcher = new IndexSearcher(Constants.INDEX_STORE_PATH);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	@SuppressWarnings("deprecation")
	public final Hits Search(String keyword) {
		System.out.println("正在检索关键字 " + keyword);
		try {
			query = new QueryParser("contents", new IK_CAnalyzer())
					.parse(keyword);
			Date start = new Date();
			Hits hits = searcher.search(query);
			Date end = new Date();
			System.out.println("检索完成,用时" + (end.getTime() - start.getTime())
					+ "毫秒");
			return hits;
		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	@SuppressWarnings("deprecation")
	public String printResult(Hits h, String test) {//显示关键字再哪个文件的哪行,用|隔开
		if (h.length() == 0) {
			System.out.println("对不起,没有找到您要的结果。");
			return "";
		} else {
			for (int i = 0; i < h.length(); i++) {
				try {
					Document doc = h.doc(i);
					System.out.print("这是第" + (i + 1) + "个检索到的结果,文件名为 :");
					System.out.println(doc.get("path"));

					BufferedReader br = new BufferedReader(new FileReader(doc.get("path")));
					String line = null;
					int lineNum = 0;
					while ((line = br.readLine()) != null) {
						lineNum++;

						if (line.indexOf(test) != -1)
							return doc.get("path")+"|"+lineNum;
					}

				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		}
		return "";
	}

	public static void main(String[] args) throws Exception {
		
		LuceneSearch temp = new LuceneSearch();
		
		
		//得到分类信息
		String content = temp.getInnerContent3("nav_w","main_w");
		content = content.replaceAll("&nbsp;", "");
		content = content.replaceAll("&gt;", ">");
		System.out.println("==========分类信息:=============\n"+content+"\n================");
		String typeinfo = content;
		
		//得到商家具体信息
		String shopInfo = "";
		content = temp.getInnerContent3("shopInfo","shopRemark");
		shopInfo = content;
		//DataOutputStream write = new  DataOutputStream(new FileOutputStream(temp.getShopInfoTxt()));
		//write.write(typeinfo.getBytes());
		
		temp.getBw().write(typeinfo.getBytes());
		
		System.out.println("得到商家信息:\n"+content);
		
		//地址信息
		int addStart = content.indexOf("地址");
		int addEnd   = content.indexOf("电话");
		if(addStart>0&&addEnd>0){
		content = content.substring(addStart+3, addEnd);
		content = content.replaceAll("&nbsp;", "");
		System.out.println("==========地址信息:=============\n"+content+"\n===============");
		}
		//write.write(content.getBytes());
		
		temp.getBw().write(content.getBytes());
		temp.getBw().write("\n".getBytes());
		
		//电话信息
		content = shopInfo;
		int telStart = content.indexOf("电话");
		int telEnd   = content.indexOf("报错");
		if(telStart>0&&telEnd>0){
		content = content.substring(telStart+3,telEnd);
		content = content.replaceAll("&nbsp;", "");
		System.out.println("=================电话信息:================\n"+content+"\n==================");
		//write.write(content.getBytes());
		temp.getBw().write(content.getBytes());
		temp.getBw().write("\n".getBytes());
		}
		
		//商家介绍
		content = shopInfo;
		int introStart = content.indexOf("商户简介");
		int introEnd   = content.indexOf("分类标签");
		
		if(introStart>0&&introEnd>0){
		content = content.substring(introStart+5,introEnd);
		content = content.replaceAll("&nbsp;", "");
		System.out.println("=================商家介绍:===============\n"+content+"\n===================");
		//write.write(content.getBytes());
		temp.getBw().write(content.getBytes());
		temp.getBw().write("\n".getBytes());
		}
		
		//分类标签
		content = shopInfo;
		int typeStart = content.indexOf("分类标签");
		int typeEnd   = content.indexOf("网友推荐");
		if(typeStart>0&&typeEnd>0){
		content = content.substring(typeStart+4,typeEnd);
		content = content.replaceAll("&nbsp;", "");
		System.out.println("=================分类标签:===============\n"+content+"\n===================");
		//write.write(content.getBytes());
		temp.getBw().write(content.getBytes());
		temp.getBw().write("\n".getBytes());
		}
		
		//网友推荐
		content = shopInfo;
		int suggestEnd = content.lastIndexOf(")");
		if(typeEnd>0&&suggestEnd>0){
		content = content.substring(typeEnd+4,suggestEnd+1);
		content = content.replaceAll("&nbsp;", "");
		System.out.println("=================网友推荐:===============\n"+content+"\n===================");
		//write.write(content.getBytes());
		//write.close();
		temp.getBw().write(content.getBytes());
		temp.getBw().write("\n".getBytes());
		}
		
		temp.getBw().close();
	}
	

	
	
	@SuppressWarnings("deprecation")
	public  String getInnerContent3(String first,String sec) throws Exception, FileNotFoundException{
		//选择两个字段之间的内容,读取其中的内容
		LuceneSearch test = new LuceneSearch();
		Hits h = null;
		String scrrenString = "";
		
		//first = "nav_w";//起始位置
		h = test.Search(first);
		String start = test.printResult(h, first);
		String fileName = start.substring(0, start.indexOf("|"));
		int startLine = Integer.parseInt(start.substring(start.indexOf("|")+1, start.length()));
		
		//sec = "main_w";//截止位置
		h = test.Search(sec);
		String end = test.printResult(h, sec);
		String fileName2 = start.substring(0, start.indexOf("|"));
		int endLine  = Integer.parseInt(end.substring(end.indexOf("|")+1, end.length()));
		
		if(fileName2.equalsIgnoreCase(fileName)){
			String tempFileName = "";
			tempFileName = fileName.substring(fileName.lastIndexOf("\\")).replace(".html", ".txt");
			tempFileName = fileName.substring(fileName.lastIndexOf("\\")).replace(".htm", ".txt");
			shopInfoTxt = new File("c:/temp/",tempFileName);
			if(!shopInfoTxt.exists())shopInfoTxt.createNewFile();
			bw = new RandomAccessFile(shopInfoTxt,"rw");    
		BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(fileName),"utf-8"));
		String line = null;
		int lineNum = 0;
		System.out.println("sentences from "+startLine+" to "+endLine);
		while ((line = br.readLine()) != null) {
			lineNum++;
			
			if (lineNum>=startLine&&lineNum<endLine)scrrenString+=line;
		}
		scrrenString = getShortFormat(scrrenString);
		scrrenString = scrrenString.substring(scrrenString.indexOf(":")+1);
		}
		return scrrenString;
	}

	public File  getShopInfoTxt() {
		return shopInfoTxt;
	}

	public RandomAccessFile getBw() {
		return bw;
	}
	private static String getShortFormat(String content){//去掉<>里面的内容
		String finalString = content.trim();
		int first = finalString.indexOf("<");
		int end = finalString.indexOf(">");
		if(first>-1&&end>-1){
			finalString = finalString.substring(0, first).trim()+finalString.substring(end+1, finalString.length()).trim();
			finalString = getShortFormat(finalString);
		}
		return finalString;
	}
	
	
}
分享到:
评论

相关推荐

    Lucene全文搜索_LuceneJava全文搜索_

    总之,Lucene作为Java全文搜索的基石,提供了强大的功能和灵活性,可以帮助开发者构建高效、精准的搜索功能,无论是简单的关键词搜索还是复杂的模糊和智能查询,都能游刃有余地应对。结合"用户管理手册.docx"的学习...

    实现多种文件格式的Lucene全文搜索功能的dom实例

    本项目“实现多种文件格式的Lucene全文搜索功能的DOM实例”专注于利用Lucene来处理不同类型的文件,并且实现了搜索结果中关键词的高亮显示,类似于百度等搜索引擎的效果。 首先,我们需要理解Lucene的基本概念。...

    LUCENE搜索引擎基本工作原理

    虽然Lucene主要是全文搜索引擎,但也可以实现目录索引的功能。目录索引是基于人工分类的,如Yahoo!早期的模式。在现代搜索引擎中,如Google,它们结合了全文搜索和目录索引,提供更全面的搜索体验。用户既可以输入...

    基于Lucene的搜索引擎

    它是Java语言实现的,可以被集成到各种应用程序中,为开发者提供了强大的文本搜索功能。在本项目中,我们看到的是一个专门针对财经类网页的搜索引擎,这展示了如何利用Lucene来处理特定领域信息的搜索需求。 ### ...

    lucene站内搜索

    它提供了丰富的文本分析、索引和搜索功能,使得开发者能够轻松地在自己的应用程序中实现复杂的全文检索功能。 ### 一、Lucene基本概念 1. **索引(Index)**: Lucene首先将文档内容转换为可搜索的结构化数据,即...

    基于Lucene的搜索策略研究

    在这种背景下,Lucene作为一种开源的全文搜索引擎库,因其简单易用且功能强大而受到广泛关注。本文将基于给定文件中的内容,深入探讨Lucene的工作原理及其在不同场景下的应用策略。 #### 1. Lucene的工作原理 ...

    Lucene 搜索方法(多短语搜索)

    Lucene是一个高性能、全文本搜索库,它提供了一个强大的文本检索框架,使得开发者能够为他们的应用程序添加高级搜索功能。多短语搜索是指在查询中包含两个或更多相邻词的短语,它比单个词的搜索更为精确,有助于用户...

    Lucene 实时搜索视频详解

    在"Lucene 实时搜索视频详解"的课程中,我们将深入探讨如何利用 Lucene 实现高效且实时的搜索功能。 一、Lucene 基础 1. **索引过程**:Lucene 的核心概念之一是建立索引,将原始文本数据转化为可快速查询的结构。...

    lucene实现全文搜索

    它提供了一种机制,使得开发者能够轻松地为自己的应用程序添加索引和搜索功能。作为Apache软件基金会的项目,Lucene具有开源和免费的特性,受到Apache软件许可证的保护。它的创始人Doug Cutting也是著名搜索引擎...

    lucene全文搜索

    ### Lucene全文搜索知识点概述 #### 一、全文检索的基本概念及应用场景 1. **全文检索定义**: ...通过本文档的学习,你可以深入了解全文检索的基本原理、Lucene的工作机制以及如何构建自己的全文搜索应用程序。

    springmvc集成lucene全文搜索

    而Lucene是Apache软件基金会的一个开放源代码全文搜索引擎库,能够帮助开发者实现强大的搜索功能。本篇文章将深入探讨如何在Spring MVC项目中集成Lucene进行全文搜索,以提升用户体验。 首先,我们需要理解Spring ...

    基于lucene的搜索引擎regain安装版

    Regain是一个基于Apache Lucene的全文搜索引擎,它提供了高级的搜索功能,能够帮助用户快速、准确地在大量数据中查找所需信息。Lucene是Java语言实现的一个开源信息检索库,为开发人员提供了一个强大的文本分析和...

    基于LUCENE的搜索引擎的设计与实现源代码

    - **网站搜索**:许多网站使用LUCENE作为内部搜索解决方案,提供快速准确的站内搜索功能。 - **大数据分析**:在海量数据中查找特定信息,LUCENE能够快速定位目标。 - **信息检索系统**:如学术论文搜索引擎、...

    lucene最新版本3.3的基本功能用法(IK分词是3.2.8)

    3. 分词处理:在3.3版本中,Lucene提供了基本的分词功能,但通常需要与其他分词器结合使用以提高搜索效果。 二、IK分词器3.2.8 1. IK分词器简介:IK (Intelligent Chinese Analyzer) 是一个针对中文的开源分词工具...

    Java搜索引擎 Lucene

    Java搜索引擎Lucene是一款开源的全文检索库,由Apache软件基金会开发并维护,它为Java开发者提供了强大的文本搜索功能。Lucene的核心目标是让开发者能够快速地在应用中集成高级的搜索功能,使得用户可以轻松地查找和...

    ssd.rar_lucene_搜索 lucene_搜索引擎_文本搜索

    它为开发者提供了在应用程序中实现全文索引和搜索功能的基础工具。Lucene的核心功能包括文本分析、索引创建、查询解析和结果排名。在"ssd.rar_lucene_搜索 lucene_搜索引擎_文本搜索"这个项目中,我们看到的是一个...

    lucene实现企业搜索实例

    Apache Lucene是一个开源的全文检索库,它提供了强大的文本搜索功能,能够帮助企业构建自己的搜索引擎。下面我们将深入探讨如何使用Lucene来实现企业级的搜索实例。 首先,我们需要理解Lucene的基本架构。Lucene的...

    lucene做的桌面搜索

    除了基本的搜索功能,该程序还可能实现了其他辅助功能,如文件类型的过滤、搜索结果的排序等。例如,用户可能可以设置只搜索特定类型的文件,如.txt或.pdf。此外,搜索结果可以按照相关性或文件名的字母顺序排列,以...

Global site tag (gtag.js) - Google Analytics