`

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 简单入门程序实例

    标题与描述:“Lucene简单入门程序实例”这一标题与描述明确指出文章将引导读者通过一个实际的示例来了解和掌握Lucene的基本操作。Lucene是一个高性能、全功能的文本搜索引擎库,它允许用户对文档进行索引和搜索。本...

    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处理文档的关键步骤,它将文本数据转换为一种结构化的、可快速搜索的形式。在创建索引时...

    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