`

Lucene学习入门之简单示例

 
阅读更多

Lucene主要就是一个用来进行信息检索的工具。

 

信息检索主要分为以下步骤:

1:构建文本库

2:建立索引

3:进行搜索

4:对结果进行过滤

 

初次接触lucene,主要流程如下:

1:切割文档,将一份文档分解为多个小文档

2:创建索引文件

3:执行索引

具体代码如下:

public class FilePreprocess {
	
	public static void preprocess(File file, String outputDir){
		try{
			splitToSmallFiles(charactorProcess(file, outputDir + "output.all"), outputDir);
		}catch(Exception e){
			e.printStackTrace();
		}
	}
        // 对文件进行处理
	public static File charactorProcess(File file, String destFile) throws Exception{
		BufferedWriter writer = new BufferedWriter(new FileWriter(destFile));
		BufferedReader reader = new BufferedReader(new FileReader(file));
		String line = reader.readLine();
		while(line != null){
			if(!line.equals("\r\n")){
				String newline = replace(line);
				writer.write(newline);
				writer.newLine();
			}
			line = reader.readLine();
		}
		reader.close();
		writer.close();
		return new File(destFile);
	}
        // 拆分文件
	public static void splitToSmallFiles(File file, String outputpath) throws IOException{
		int filePointer = 0;
		int MAX_SIZE = 10240;
		BufferedWriter writer = null;
		BufferedReader reader = new BufferedReader(new FileReader(file));
		StringBuffer buffer = new StringBuffer();
		String line = reader.readLine();
		while(line != null){
			buffer.append(line).append("\r\n");
			if(buffer.toString().getBytes().length >= MAX_SIZE){
				writer = new BufferedWriter(new FileWriter(outputpath + "output" + filePointer + ".txt"));
				writer.write(buffer.toString());
				writer.close();
				filePointer ++;
				// 清空缓存区的数据
				buffer = new StringBuffer();
			}
			line = reader.readLine();
		}
		writer = new BufferedWriter(new FileWriter(outputpath + "output" + filePointer + ".txt"));
		writer.write(buffer.toString());
		writer.close();
	}
        // 转换文档中的特殊字符
	private static String replace(String line){
		HashMap map = new HashMap();
		map.put(",", ",");
		map.put("。", ",");
		map.put("《", "<");
		map.put("》", ">");
		map.put("【", "[");
		map.put("】", "]");
		map.put("{", "{");
		map.put("}", "}");
		map.put(":", ":");
		map.put("!", "!");
		int length = line.length();
		for(int i =0;i<length;i++){
			String charat = line.substring(i, i+1);
			if(map.get(charat) != null){
				line = line.replace(charat, (String)map.get(charat));
			}
		}
		return line;
	}
	
	public static void main(String[] args) {
		String inputFile = "d:\\book.txt";
		String outputDir = "d:\\testfolder\\";
		if(!new File(outputDir).exists()){
			new File(outputDir).mkdirs();
		}
		FilePreprocess filePreprocess = new FilePreprocess();
		filePreprocess.preprocess(new File(inputFile), outputDir);
	}

}

 建立索引:

public class IndexProcesser {
	
	// 成员变量,存储创建的索引文件存放的位置
	private String INDEX_STORE_PATH = "d:\\index";
	
	// 创建索引
	public void createIndex(String inputDir){
		try{
			// 以MMAnalyzer作为分词工具创建一个IndexWriter
			IndexWriter writer = new IndexWriter(INDEX_STORE_PATH, new MMAnalyzer(), true);
			File filesDir = new File(inputDir);
			// 取得所有需要建立索引的文件数组
			File[] files = filesDir.listFiles();
			// 遍历数组
			for(int i =0;i<files.length;i++){
				String fileName = files[i].getName();
				if(fileName.substring(fileName.lastIndexOf(".")).equals(".txt")){
					// 创建一个新的Document
					Document doc = new Document();
					// 为文件名创建一个Field
					Field field = new Field("filename", files[i].getName(), Field.Store.YES, Field.Index.TOKENIZED);
					doc.add(field);
					// 为文件内容创建一个Field
					field = new Field("content", loadFileToString(files[i]), Field.Store.YES, Field.Index.TOKENIZED);
					doc.add(field);
					// 把Document加入IndexWriter
					writer.addDocument(doc);
				}
			}
			writer.close();
		}catch(Exception e){
			e.printStackTrace();
		}
	}
	public String loadFileToString(File file){
		try{
			BufferedReader br = new BufferedReader(new FileReader(file));
			StringBuffer sb = new StringBuffer();
			String line = br.readLine();
			while(line != null){
				sb.append(line);
				line = br.readLine();
			}
			br.close();
			return sb.toString();
		}catch(Exception e){
			e.printStackTrace();
			return null;
		}
	}
	public static void main(String[] args) {
		IndexProcesser indexProcesser = new IndexProcesser();
		indexProcesser.createIndex("d:\\testfolder");
	}

}

 执行查询:

public class Search {
	
	private String INDEX_STORE_PATH = "d:\\index";
	
	public void indexSearch(String searchType, String searchKey){
		try{
			IndexSearcher searcher = new IndexSearcher(INDEX_STORE_PATH);
			
			Term t = new Term(searchType, searchKey);
			Query q = new TermQuery(t);
//			Hits hit = searcher.search(q);
//			System.out.println("*************************");
//			for(int i =0;i<hit.length();i++){
//				System.out.println(hit.doc(i));
//			}
			// 搜索开始时间
			Date beginTime = new Date();
			// 获取一个<document, frequency>的枚举对象TermDocs
			TermDocs termDocs = searcher.getIndexReader().termDocs(t);
			while(termDocs.next()){
				// 输出文档中出现关键字的次数
				System.out.println(termDocs.freq());
				//输出搜索到关键词的文档
				System.out.println(searcher.getIndexReader().document(termDocs.doc()));
			}
			Date endTime = new Date();
			// 时长
			long timeOfSearch = endTime.getTime() - beginTime.getTime();
			System.out.println("The time For indexsearch is " + timeOfSearch + " ms");
		}catch(Exception e){
			e.printStackTrace();
		}
	}
}

 所用jar包请参考附件

 

 

分享到:
评论

相关推荐

    Lucene5学习之创建索引入门示例

    **Lucene5学习之创建索引入门示例** 在IT领域,搜索引擎的开发与优化是一项关键技术,而Apache Lucene作为一款高性能、全文本搜索库,是许多开发者进行文本检索的首选工具。本文将深入探讨如何使用Lucene5来创建一...

    Lucene5学习之自定义同义词分词器简单示例

    本篇将聚焦于"Lucene5学习之自定义同义词分词器简单示例",通过这个主题,我们将深入探讨如何在Lucene5中自定义分词器,特别是实现同义词扩展,以提升搜索质量和用户体验。 首先,理解分词器(Analyzer)在Lucene中...

    Lucene实战之搜索引擎示例

    《Lucene实战之搜索引擎示例》 在信息技术领域,搜索引擎是一种不可或缺的工具,它使得海量数据的检索变得高效且便捷。本文将深入探讨如何利用Apache Lucene构建一个强大的搜索引擎,覆盖HTML、TXT、PDF和Word等...

    lucene示例 demo+jar包

    **Lucene 全文检索引擎概述** Lucene 是一个开源的..."lucene示例"可以帮助初学者理解并实践 Lucene 的主要功能,而提供的 jar 包则是运行 Lucene 应用的基础。学习并掌握 Lucene,将有助于提升应用程序的搜索体验。

    lucene搜索的简单入门例子源代码

    本篇将通过一个简单的入门例子,带你了解如何使用Lucene进行搜索。 首先,我们要知道Lucene的核心组件包括文档(Document)、字段(Field)、索引(Index)和查询(Query)。在Lucene中,信息是以文档的形式存储,...

    lucene学习入门程序

    同时,你也将接触到Lucene的主要API和概念,为进一步深入学习和应用Lucene打下基础。在实践中,你可以尝试不同的Analyzer,调整搜索参数,优化性能,或者实现更复杂的功能,如多字段搜索、拼音搜索等。

    lucene学习资料收集

    【标签】:“源码”和“工具”这两个标签暗示了这个压缩包可能包含Lucene的源代码示例和相关工具,帮助开发者更深入地理解其内部工作原理,并能够利用这些工具进行实际操作。 【文件名称列表】:“org”可能是指...

    盘古分词、lucene3.0.3搜索的使用示例v1.2

    盘古分词和Lucene是两个在中文信息处理领域广泛应用的工具,本示例将详细介绍如何在.NET 4.0环境中整合这两个组件,以实现高效的全文搜索功能,并新增了分页功能,为开发者提供了更便捷的开发体验。 首先,盘古分词...

    lucene入门代码示例

    最受欢迎的java开源全文搜索引擎开发工具包。 提供了完整的查询引擎和... Lucene的目的是为软件开发人员提供一个简单易用的工具包, 以方便在目标系统中实现全文检索功能, 或者是以此为基础建立起完整的全文检索引擎。

    Lucene 4.8全文检索引擎入门示例文档

    《Lucene 4.8 全文检索引擎入门详解》 Lucene 是一款开源的全文检索库,由 Apache 软件基金会维护。在版本 4.8 中,Lucene 提供了强大的文本分析、索引构建和搜索功能,使得开发者能够轻松地在应用程序中集成高效的...

    Lucene的的学习资料及案例

    **Lucene学习指南** Lucene是一个高性能、全文检索库,由Apache软件基金会开发并维护,是Java编程语言中广泛使用的搜索引擎库。它提供了一个简单的API,使得开发者能够方便地在应用中实现全文检索功能。本篇文章将...

    Lucene与数据库结合示例(加双关键字高亮)

    "只是个简单的示例"暗示这可能是初级或中级难度的教程,适合初学者或有一定基础的学习者参考。"加了高亮,看起来就更好点"意味着这个示例不仅实现了基本的搜索功能,还加入了高亮显示搜索关键词的特性,使得用户能更...

    盘古分词、lucene3.0.3搜索的使用示例.zip

    对于中文信息处理来说,分词是基础步骤,因为中文句子没有明显的空格来划分词汇,因此需要通过特定的算法来识别和分割出一个个单独的词语。盘古分词提供了丰富的分词模式,包括精确模式、全模式、简明模式等,可以...

    盘古分词、lucene3.0.3搜索的使用示例v1.3.zip

    盘古分词,作为一款优秀的中文分词系统,能够高效准确地对中文文本进行分词,为后续的数据分析和处理提供基础。而Lucene则是一款强大的全文搜索引擎库,它提供了索引、查询以及结果排序等功能,使得开发者能够在自己...

    lucene 索引小示例

    本篇文章将通过一个简单的小示例,深入探讨Lucene的核心概念和操作流程。 首先,我们需要理解Lucene的索引机制。索引是Lucene处理文档的关键步骤,它将文本数据转换为一种结构化的、可快速搜索的形式。在创建索引时...

    Lucene简单实例记录

    ### Lucene的入门实例 #### 建立索引 1. **包导入**:首先,需要导入Lucene相关的包,包括`java.io`用于文件操作,`org.apache.lucene.analysis`用于文本分析,`org.apache.lucene.document`用于创建文档对象,...

    IKAnalyzer修复源码,Lucene3.6 Jar及使用示例

    IKAnalyzer是一款广受欢迎的开源中文分词器,主要用于提高中文信息检索、文本分析等领域...通过学习和使用这些资料,不仅可以了解IKAnalyzer和Lucene的基础知识,还能掌握如何处理中文文本信息,以及如何优化搜索性能。

    Lucene5学习之排序-Sort

    “Lucene5学习之排序-Sort”这个标题表明了我们要探讨的是关于Apache Lucene 5版本中的排序功能。Lucene是一个高性能、全文检索库,它提供了强大的文本搜索能力。在这个主题中,我们将深入理解如何在Lucene 5中对...

    Lucene5学习之Group分组统计

    "Lucene5学习之Group分组统计" 这个标题指出我们要讨论的是关于Apache Lucene 5版本中的一个特定功能——Grouping。在信息检索领域,Lucene是一个高性能、全文搜索引擎库,而Grouping是它提供的一种功能,允许用户对...

Global site tag (gtag.js) - Google Analytics