`

浅尝Lucene

阅读更多
package com.test.lucene;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;
import java.util.Date;


import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.standard.StandardAnalyzer;  
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriter.MaxFieldLength;
import org.apache.lucene.queryParser.ParseException;
import org.apache.lucene.queryParser.QueryParser;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.Searcher;
import org.apache.lucene.search.TopDocs;
import org.apache.lucene.search.TopScoreDocCollector;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.store.SimpleFSDirectory;
import org.apache.lucene.util.Version;

public class HelloLucene {
	
	/**
	 * 
	 * @throws IOException
	 */
	@SuppressWarnings("deprecation")
	public static void createIndex () throws IOException{
		//存储索引文件
		Directory indexDir =  new SimpleFSDirectory(new File("D://luceneIndex"));
		
		//需要检索的文件信息
		File dataDir = new File("D://luceneTest");
		
		//在一个文档被索引之前,首先对文档内容进行分词处理 (分词器)
		Analyzer luceneAnalyzer = new StandardAnalyzer(Version.LUCENE_33);
		
		//File [] dataFiles = dataDir.listFiles();
		
		//IndexWriter 是 Lucene 用来创建索引的一个核心的类,他的作用是把一个个的 Document 对象加到索引中来
		//第一个参数是索引存放位置
		//第二个参数是Analyzer类的一个实现
		//第三个boolean参数 true表示创建一个新的索引 false表示在原有索引基础上操作
		//第四个参数 最大文件长度 MaxFileLength UNLIMITED无限的
		IndexWriter indexWriter = new IndexWriter(indexDir, luceneAnalyzer, true,IndexWriter.MaxFieldLength.LIMITED);
		
		long startTime = new Date().getTime();
		
		//遍历dataDir下所有文件
		indexDirectory(indexWriter,dataDir);
		
//		if(dataDir.isHidden() || dataDir.exists() || dataDir.canRead())
//			return;
//		System.out.println("path: "+dataDir.getCanonicalPath());
//		Document doc=new Document();
//		doc.add(new Field("contents",new FileReader(dataDir)));
//		doc.add(new Field("filename",dataDir.getCanonicalPath(),Field.Store.YES,Field.Index.ANALYZED));
//		indexWriter.addDocument(doc);
		
		indexWriter.optimize();
		indexWriter.close();//创建结束
		
		long endTime = new Date().getTime();
		System.out.println("索引数: "+indexWriter.numDocs());
		System.out.println("用时"+(endTime-startTime)+"毫秒来创建文件中的索引."+dataDir.getPath());
	}
	
	/**
	 * 遍历dataDir下所有文件 进行索引
	 * @param indexWriter
	 * @param dataDir
	 * @throws IOException
	 */
	public static void indexDirectory(IndexWriter indexWriter,File dataDir) throws IOException{
		File [] dataFiles = dataDir.listFiles();
//		FileReader fr = new FileReader(dataDir);
//		BufferedReader br = new BufferedReader(fr);
//		String line = br.readLine();
//				
//	    int j=1;
//        while (line != null)
//        {
//            line = br.readLine();
//            j=j+1;
//        }
//		br.close();
//		fr.close();
		
		for (int i = 0; i < dataFiles.length; i++) {
		
			if (dataFiles[i].isDirectory()) {
	            //递归  
	            indexDirectory(indexWriter,dataFiles[i]);  
	        } else if(dataFiles[i].isFile() && dataFiles[i].getName().endsWith(".txt")){
				System.out.println("files: "+dataFiles[i].getCanonicalPath());
				
				//文档
				Document document = new Document();
				
				Reader txtReader = new FileReader(dataFiles[i]);
				
				//Field.Store.YES 存储 Field.Index.ANALYZED 分词
				document.add(new Field("path",dataFiles[i].getCanonicalPath(),Field.Store.YES,Field.Index.NOT_ANALYZED));
	            document.add(new Field("fileName",dataFiles[i].getName(),Field.Store.YES,Field.Index.ANALYZED)); 
	            // 另外一个构造函数,接受一个Reader对象
	            document.add(new Field("contents",txtReader));
	            indexWriter.addDocument(document);
			}
		}
	}
	
	
	@SuppressWarnings("deprecation")
	public static void searchIndex() throws IOException, ParseException{
		String queryStr = "filename:令狐冲";
		
		//在一个文档被索引之前,首先对文档内容进行分词处理 (分词器)
		Analyzer luceneAnalyzer = new StandardAnalyzer(Version.LUCENE_33);
		
		//主机索引目录//D:\\usr\\local\\wings\\SEARCH_INDEX\\WINGS D:\\luceneIndex
		File indexDir = new File("D:\\luceneIndex");
		
		FSDirectory directory = FSDirectory.open(indexDir);
		
		IndexSearcher indexSearcher=new IndexSearcher(directory,true);
		
		QueryParser parserContents = new QueryParser(Version.LUCENE_33, "contents", luceneAnalyzer);
	    QueryParser parserFilename = new QueryParser(Version.LUCENE_33,"filename", luceneAnalyzer);
	    
	    //生成Query对象
	    Query query = parserFilename.parse(queryStr);
	    
	    //搜索结果
	    TopScoreDocCollector collector = TopScoreDocCollector.create(50, false); 
	    
	    //开始计时
	    long start = new Date().getTime();
	    
	    indexSearcher.search(query, collector);
	    
	    //搜索结果TopScoreDocCollector里面有 TopDocs,TopDocs里面有scoreDocs[]数组,里面保存着索引值.
	    ScoreDoc[] hits = collector.topDocs().scoreDocs;  
	    
	    System.out.println("共有: "+hits.length+"条记录...");
	    
	    //循环ScoreDoc数据,并使用indexSearch.doc方法把Document还原,再拿出对应的字段的值    
        for (int i = 0; i < hits.length; i++) {
        	
            // new method is.doc()
        	//使用indexSearch.doc方法把Document还原
            Document doc = indexSearcher.doc(hits[i].doc);
            
            System.out.println(doc.getField("fileName") + "------------"+ hits[i].toString());
        }
        
	    indexSearcher.close();
	    
	    //结束计时
	    long end = new Date().getTime();
	    System.out.println("用时"+(end-start)+"毫秒来搜索文件中的索引.");
	}
	
	
	
	
	public static void main(String[] args) throws ParseException{
		try {
			createIndex();
			System.out.println("--------------------------------");
			searchIndex();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

分享到:
评论

相关推荐

    lucene,lucene教程,lucene讲解

    lucene,lucene教程,lucene讲解。 为了对文档进行索引,Lucene 提供了五个基础的类 public class IndexWriter org.apache.lucene.index.IndexWriter public abstract class Directory org.apache.lucene.store....

    lucene3.0 lucene3.0

    lucene3.0 lucene3.0 lucene3.0 lucene3.0 lucene3.0

    lucene-4.7.0全套jar包

    【Lucene 4.7.0 全套JAR包详解】 Lucene是一个开源全文搜索引擎库,由Apache软件基金会开发并维护。它提供了一个高级、灵活的文本搜索API,允许开发者轻松地在应用程序中实现复杂的搜索功能。这次提供的“lucene-...

    Lucene3.5源码jar包

    本压缩包包含的是Lucene 3.5.0版本的全部源码,对于想要深入理解Lucene工作原理、进行二次开发或者进行搜索引擎相关研究的开发者来说,是一份非常宝贵的学习资源。 Lucene 3.5.0是Lucene的一个重要版本,它在3.x...

    Lucene时间区间搜索

    Lucene是一款强大的全文搜索引擎库,广泛应用于各种数据检索场景。在C#环境下,利用Lucene进行时间区间搜索是提高数据检索效率和精确度的重要手段。本篇将深入探讨如何在C#中实现Lucene的时间区间查询匹配,以及涉及...

    lucene in action英文版 lucene 3.30包

    《Lucene in Action》是关于Apache Lucene的权威指南,这本书深入浅出地介绍了全文搜索引擎的构建和优化。Lucene是一个高性能、全文本搜索库,它允许开发人员在应用程序中轻松实现复杂的搜索功能。这本书主要面向...

    Lucene示例 BM25相似度计算

    在IT领域,搜索引擎技术是至关重要的,而Lucene作为一个开源全文搜索引擎库,广泛应用于各种文本检索系统中。本文将深入探讨Lucene示例中的BM25相似度计算,旨在帮助初学者理解如何利用Lucene 4.7.1版本构建索引、...

    Annotated Lucene 中文版 Lucene源码剖析

    《Annotated Lucene 中文版 Lucene源码剖析》是一本深入探讨Apache Lucene的书籍,专注于源码解析,帮助读者理解这个强大的全文搜索引擎库的工作原理。Lucene是一款开源的Java库,它提供了高效的文本搜索功能,被...

    Lucene简介.介绍

    【Lucene 简介】 Lucene 是一个强大的开源全文搜索库,由 Java 编写,主要用于为应用程序添加全文检索功能。它不是一个完整的全文搜索引擎应用,而是一个工具包,允许开发者将其集成到自己的软件中,以实现高效、...

    计算机专业外文翻译(lucene相关)

    "计算机专业外文翻译(lucene相关)" 本文翻译了论文"Scale-up x Scale-out: A Case Study using Nutch/Lucene",介绍了计算机专业领域中关于Lucene相关的知识点。 Scale-up vs Scale-out 论文中讨论了两个相对...

    lucene 2.0 api以及lucene 3.0 api

    **Lucene 2.0 API 和 Lucene 3.0 API 深度解析** Lucene 是一个由 Apache 软件基金会开发的全文搜索引擎库,它为开发者提供了在 Java 应用程序中实现高性能、可扩展的全文搜索功能的能力。Lucene 的 API 设计得相当...

    Lucene的原理完整版pdf

    **Lucene原理详解** Lucene是一个高性能、全文检索库,由Apache软件基金会开发并维护,是Java编程语言中广泛使用的搜索引擎库。它提供了一个简单但功能强大的API,用于索引和搜索文本数据,使得开发者可以轻松地在...

    lucene所有的jar包

    《全面解析Lucene jar包:从基础到应用》 在信息技术高速发展的今天,搜索引擎已经成为我们获取信息不可或缺的工具。在Java领域,Lucene作为一个强大的全文搜索引擎库,深受开发者喜爱。本文将详细介绍“lucene所有...

    lucene in action 2nd edition, lucene in action 第二版 PDF

    《Lucene in Action 第二版》是一本深入探讨Apache Lucene全文检索库的专业书籍,它在Java开发领域具有很高的权威性。这本书详细介绍了如何利用Lucene进行高效的文本搜索和索引构建,是Java开发者和信息检索爱好者的...

    lucene-core-7.7.0-API文档-中文版.zip

    赠送jar包:lucene-core-7.7.0.jar; 赠送原API文档:lucene-core-7.7.0-javadoc.jar; 赠送源代码:lucene-core-7.7.0-sources.jar; 赠送Maven依赖信息文件:lucene-core-7.7.0.pom; 包含翻译后的API文档:lucene...

    Lucene与关系型数据库对比

    《Lucene与关系型数据库对比:深度解析与应用探索》 在信息爆炸的时代,数据管理和检索成为了企业乃至个人日常工作中不可或缺的部分。随着技术的发展,不同的数据处理方式应运而生,其中Lucene与关系型数据库作为两...

    Lucene资料大全(包括Lucene_in_Action书等)

    标题"Lucene资料大全(包括Lucene_in_Action书等)"表明这是一个包含全面Lucene学习资源的集合,其中最显著的是《Lucene_in_Action》这本书。这是一本广泛认可的关于Apache Lucene的权威指南,通常被简称为LIA,它深入...

    lucene.NET 中文分词

    **Lucene.NET 中文分词技术详解** Lucene.NET 是一个高性能、全文检索库,它是Apache Lucene项目在.NET平台上的实现。作为一个开源的搜索引擎框架,Lucene.NET为开发者提供了强大的文本搜索功能。而在处理中文文档...

    Lucene 5 主要jar包

    Apache Lucene是一个开源全文搜索引擎库,它为Java开发者提供了强大的文本搜索功能。在这个"Lucene 5 主要jar包"中,我们找到了一系列与Lucene 5.0.0相关的jar文件,这些文件是构建和运行基于Lucene的搜索应用程序的...

    lucene 4.7.2 Demo

    《Lucene 4.7.2 Demo:Java全文搜索引擎的核心技术探索》 Lucene,作为Apache软件基金会的一个开源项目,是Java平台上的一个全文搜索引擎库。它的主要功能是提供高效、可扩展的文本检索和分析能力。在4.7.2这个版本...

Global site tag (gtag.js) - Google Analytics