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学习之创建索引入门示例** 在IT领域,搜索引擎的开发与优化是一项关键技术,而Apache Lucene作为一款高性能、全文本搜索库,是许多开发者进行文本检索的首选工具。本文将深入探讨如何使用Lucene5来创建一...
本篇将聚焦于"Lucene5学习之自定义同义词分词器简单示例",通过这个主题,我们将深入探讨如何在Lucene5中自定义分词器,特别是实现同义词扩展,以提升搜索质量和用户体验。 首先,理解分词器(Analyzer)在Lucene中...
《Lucene实战之搜索引擎示例》 在信息技术领域,搜索引擎是一种不可或缺的工具,它使得海量数据的检索变得高效且便捷。本文将深入探讨如何利用Apache Lucene构建一个强大的搜索引擎,覆盖HTML、TXT、PDF和Word等...
**Lucene 全文检索引擎概述** Lucene 是一个开源的..."lucene示例"可以帮助初学者理解并实践 Lucene 的主要功能,而提供的 jar 包则是运行 Lucene 应用的基础。学习并掌握 Lucene,将有助于提升应用程序的搜索体验。
本篇将通过一个简单的入门例子,带你了解如何使用Lucene进行搜索。 首先,我们要知道Lucene的核心组件包括文档(Document)、字段(Field)、索引(Index)和查询(Query)。在Lucene中,信息是以文档的形式存储,...
同时,你也将接触到Lucene的主要API和概念,为进一步深入学习和应用Lucene打下基础。在实践中,你可以尝试不同的Analyzer,调整搜索参数,优化性能,或者实现更复杂的功能,如多字段搜索、拼音搜索等。
【标签】:“源码”和“工具”这两个标签暗示了这个压缩包可能包含Lucene的源代码示例和相关工具,帮助开发者更深入地理解其内部工作原理,并能够利用这些工具进行实际操作。 【文件名称列表】:“org”可能是指...
盘古分词和Lucene是两个在中文信息处理领域广泛应用的工具,本示例将详细介绍如何在.NET 4.0环境中整合这两个组件,以实现高效的全文搜索功能,并新增了分页功能,为开发者提供了更便捷的开发体验。 首先,盘古分词...
最受欢迎的java开源全文搜索引擎开发工具包。 提供了完整的查询引擎和... Lucene的目的是为软件开发人员提供一个简单易用的工具包, 以方便在目标系统中实现全文检索功能, 或者是以此为基础建立起完整的全文检索引擎。
《Lucene 4.8 全文检索引擎入门详解》 Lucene 是一款开源的全文检索库,由 Apache 软件基金会维护。在版本 4.8 中,Lucene 提供了强大的文本分析、索引构建和搜索功能,使得开发者能够轻松地在应用程序中集成高效的...
**Lucene学习指南** Lucene是一个高性能、全文检索库,由Apache软件基金会开发并维护,是Java编程语言中广泛使用的搜索引擎库。它提供了一个简单的API,使得开发者能够方便地在应用中实现全文检索功能。本篇文章将...
"只是个简单的示例"暗示这可能是初级或中级难度的教程,适合初学者或有一定基础的学习者参考。"加了高亮,看起来就更好点"意味着这个示例不仅实现了基本的搜索功能,还加入了高亮显示搜索关键词的特性,使得用户能更...
对于中文信息处理来说,分词是基础步骤,因为中文句子没有明显的空格来划分词汇,因此需要通过特定的算法来识别和分割出一个个单独的词语。盘古分词提供了丰富的分词模式,包括精确模式、全模式、简明模式等,可以...
盘古分词,作为一款优秀的中文分词系统,能够高效准确地对中文文本进行分词,为后续的数据分析和处理提供基础。而Lucene则是一款强大的全文搜索引擎库,它提供了索引、查询以及结果排序等功能,使得开发者能够在自己...
本篇文章将通过一个简单的小示例,深入探讨Lucene的核心概念和操作流程。 首先,我们需要理解Lucene的索引机制。索引是Lucene处理文档的关键步骤,它将文本数据转换为一种结构化的、可快速搜索的形式。在创建索引时...
### Lucene的入门实例 #### 建立索引 1. **包导入**:首先,需要导入Lucene相关的包,包括`java.io`用于文件操作,`org.apache.lucene.analysis`用于文本分析,`org.apache.lucene.document`用于创建文档对象,...
IKAnalyzer是一款广受欢迎的开源中文分词器,主要用于提高中文信息检索、文本分析等领域...通过学习和使用这些资料,不仅可以了解IKAnalyzer和Lucene的基础知识,还能掌握如何处理中文文本信息,以及如何优化搜索性能。
“Lucene5学习之排序-Sort”这个标题表明了我们要探讨的是关于Apache Lucene 5版本中的排序功能。Lucene是一个高性能、全文检索库,它提供了强大的文本搜索能力。在这个主题中,我们将深入理解如何在Lucene 5中对...
"Lucene5学习之Group分组统计" 这个标题指出我们要讨论的是关于Apache Lucene 5版本中的一个特定功能——Grouping。在信息检索领域,Lucene是一个高性能、全文搜索引擎库,而Grouping是它提供的一种功能,允许用户对...