当前位置:首页 > 开发 > 编程语言 > 搜索 > 正文

利用lucene对文件内容进行关键字检索

发表于: 2015-06-24   作者:zh-workhard-Java   来源:转载   浏览:
摘要: 在具体实现之前,请根据自己的要求,建立对应的路径及文件。例如,我这边创建的路径及文件是:     D:/tools/LearningByMyself/lucene/source/demo1.txt D:/tools/LearningByMyself/lucene/source/demo2.txt D:/tools/LearningByMyself/lucene/index

在具体实现之前,请根据自己的要求,建立对应的路径及文件。例如,我这边创建的路径及文件是:     D:/tools/LearningByMyself/lucene/source/demo1.txt

D:/tools/LearningByMyself/lucene/source/demo2.txt

D:/tools/LearningByMyself/lucene/index

 

第一步,建立索引,代码如下:

      

/**
   * @param sourceFile 需要添加到索引中的路径
   * @param indexFile  存放索引的路径
   * @throws Exception
   */
public static void textFileIndexer(String sourceFile,String indexFile)         throws Exception{
		File sourceDir = new File(sourceFile),
			 indexDir = new File(indexFile); 	
	 
		Directory dir =  FSDirectory.open(indexDir);
                Analyzer luceneAnalyzer = new   StandardAnalyzer(Version.LUCENE_36); 		
		IndexWriterConfig iwc = new IndexWriterConfig(Version.LUCENE_36,luceneAnalyzer); 		
		iwc.setOpenMode(OpenMode.CREATE); 
		IndexWriter indexWriter = new IndexWriter(dir,iwc);
     
        File[] textFiles = sourceDir.listFiles();       
        long startTime = new Date().getTime(); 
        
        for(int i=0;i<textFiles.length;i++){
        	if(textFiles[i].isFile() && textFiles[i].getName().endsWith(".txt")){
        		System.out.println("File--->" + textFiles[i].getCanonicalPath() + " 正在被索引.....");
        		String str_temp = fileReaderAll(textFiles[i].getCanonicalPath(),"UTF-8");
        		System.out.println("文件内容:" + str_temp);
        		
        		Document document = new Document();
        		Field field_path = new Field("path",textFiles[i].getCanonicalPath(),
        				Field.Store.YES,Field.Index.NO);
        		Field field_body = new Field("body",str_temp,Field.Store.YES,
        				Field.Index.ANALYZED,Field.TermVector.WITH_POSITIONS_OFFSETS);
        		document.add(field_path);
        		document.add(field_body);
        		
        		indexWriter.addDocument(document);
        	}
        }
        
        indexWriter.close();
        
        long endTime = new Date().getTime();
        
        System.out.println("一共花费了" + 
               (endTime - startTime) + "毫秒将" + sourceDir.getPath() + "中的文件增加到索引里面去.....");
	}

 

private static String fileReaderAll(String filename,String charset) throws IOException{
		BufferedReader buffer_read = new BufferedReader(
				new InputStreamReader(new FileInputStream(filename),charset));
		String line = new String();
		String temp = new String();
		
		while((line = buffer_read.readLine()) != null){
			temp += line ;
		}
		
		buffer_read.close();
		
		return temp ;
	}

 第二步,在索引中检索关键字

 

    

/**
     * @param indexFile 索引所在的路径
     * @param keyWords  需要检索的关键字
     * @throws IOException
     * @throws ParseException
     */
     public static void queryKeyWords(String indexFile,String keyWords) throws IOException,ParseException{
    	IndexReader reader = IndexReader.open(
				FSDirectory.open(new File(indexFile)));
		IndexSearcher index_search = new IndexSearcher(reader);
									
		Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_36);				
	    QueryParser query_parser = new QueryParser(Version.LUCENE_36,"body",analyzer);	    
	    Query query = query_parser.parse(keyWords);
		
		if(index_search != null){
	    	TopDocs result = index_search.search(query, 10); //返回最多为10条记录
	    	ScoreDoc[] hits = result.scoreDocs;
	    	
	    	if(hits.length > 0){
	    		System.out.println("关键字:" + keyWords + ",在  " + indexFile + "中,一共检索到" + hits.length + "个...");
	    	}
	    	
	    	index_search.close();
	    }
    }

第三部,自己编写一个测试类,测试一下上面的两个方法,例如,我写的测试类如下:

 

   

public class LuceneTest {
	public static void main(String[] args) throws IOException,ParseException,Exception{
		String sourcePath = "D:/tools/LearningByMyself/lucene/source" ;
		String indexPath = "D:/tools/LearningByMyself/lucene/index" ;
		String key_words = "服务器" ;
		
		LuceneIndex.textFileIndexer(sourcePath, indexPath);
		LuceneIndex.queryKeyWords(indexPath, key_words);
		
	}
}

  最后,在控制台上查看结果。例如,我这边的测试结果如下:

 

    File--->D:\tools\LearningByMyself\lucene\source\demo1.txt 正在被索引.....

    文件内容:为了保证机房的网络安全,IDC内所有服务器不被允许从办公网直接ssh登录,必须通过跳板机 进行间接登录。用户通过跳板机执行的所有命令(包括通过跳板机登录的其他机器后的命令)都会被保存并审计。

    File--->D:\tools\LearningByMyself\lucene\source\demo2.txt 正在被索引.....

文件内容:Relay是我们登录IDC服务器的跳板机,在Relay上用户只能执行ssh、passwd等简单命令,Relay只做ssh跳板机儿不做日常工具机使用。

一共花费了235毫秒将D:\tools\LearningByMyself\lucene\source中的文件增加到索引里面去.....

关键字:服务器,在  D:/tools/LearningByMyself/lucene/index中,一共检索到2个...

利用lucene对文件内容进行关键字检索

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

编辑推荐
Apache Lucene是一个开放源程序的搜寻器引擎,利用它可以轻易地为Java软件加入全文搜寻功能。Lucene
solrJ可以看成是solr的java版客户端,提供基本的索引维护、检索等功能。 solrJ和solr服务端有两种“
使用Lucene检索文档关键字时,具体步骤如下: 1.对文档处理 2.为要处理的文件内容建立索引 3.构建查询
Java相关技术 - 文件内容检索工具 拿到一个几百M甚至上G的project让你去学习 有时候你会想知道某个
转载出处:http://aleeee.com/file_search.html 网络上很多关于WIN7文件内容检索的博文,大多是通过
转自: http://www.cnblogs.com/huangfox/archive/2012/02/13/2348949.html solrJ可以看成是solr的j
/* * * 这段代码用来测试文件segment.fnm等文件所包含的内容 * * */ 生成的索引文件.fnm中所包含了D
原文地址:http://user.qzone.qq.com/523906455/blog/1324284955 不管怎么说,搜索都是非常重要的技
一,概念介绍 目前系统中存在着大量的报文信息,每条报文的数据量较小,大概2000-3000字节左右,但是
全文检索的概念 1.从大量的信息中快速、准确的查找要的信息 2.收索的内容是文本信息 3.不是根据语句
版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号