lucene4.2.1 入门
2013-09-28 16:28
281 查看
Lucene 是一个基于Java的全文信息检索工具包,是Apache软件基金会jakarta项目组的一个子项目,为应用程序提供索引和搜索功能,其它介绍网上多的是……
在全文索引工具中都是由这样的三部分组成:1.索引部分
2.分词部分(如何分词)
3.搜索部分
觉得学习一个新知识还是直接从一个简单的例子学习来的快,就如刚开始学习c时,先从”hello world!”,然后慢慢分析其中的细节,那下面来就来看一个简单的例子吧,这个例子实现功能:在一些文档中查找某个关键词
所需要的jar包,都在lucene下载包里,只不过在不同的文件夹下:
lucene-core-4.2.1.jar
lucene-queryparser-4.2.1.jar
lucene-analyzers-common-4.2.1.jar
下面的代码有详细的解释:
public class HelloLucene { /* * 建立索引 */ public void index() { IndexWriter writer = null; try { // 1.创建Directory,确定索引建立在硬盘或者是内存中 // Directory directory=new RAMDirectory(); //建立在内存中 Directory directory = FSDirectory .open(new File("f:\\lucene\\index"));// 把索引存在这个位置 // 2.创建IndexWriter,通过它来写索引到上述位置 参1:lucene的版本,参2:用的分词器 IndexWriterConfig iwc = new IndexWriterConfig(Version.LUCENE_42, new StandardAnalyzer(Version.LUCENE_42)); writer = new IndexWriter(directory, iwc); // 3.创建Document对象,相当于数据库中的表 处理要建立索引的文档 Document doc = null; // 4.为Document添加Field,Field相当于数据库中的字段 File file = new File("F:\\lucene\\documents");// 要建立索引的文档所在文件夹 // 为每篇文档添加field,索引文档的 内容/名称/路径 for (File f : file.listFiles()) { doc = new Document(); doc.add(new TextField("content", new FileReader(f)));// 分词,不存储 doc.add(new StringField("filename", f.getName(), Field.Store.YES));// 不分词,存储 doc.add(new StringField("path", f.getAbsolutePath(), Field.Store.YES));// 在api中看看TextField和StringField的不同 // 5.通过IndexWriter添加文档到索引中 writer.addDocument(doc); } } catch (IOException e) { e.printStackTrace(); } finally { if (writer != null) try { writer.close(); } catch (IOException e) { } } } /*** 搜索 */ public void seracher() { // 1.创建Directory Directory directory; try { directory = FSDirectory.open(new File("f:\\lucene\\index")); // 2.创建IndexReader 读取索引 IndexReader reader = DirectoryReader.open(directory); // 3.根据IndexReader创建IndexSearcher IndexSearcher searcher = new IndexSearcher(reader); // 4.创建搜索的Query // 创建parser来确定要搜索文件的内容,第二个参数表示搜索的域 QueryParser parser = new QueryParser(Version.LUCENE_42, "content", new StandardAnalyzer(Version.LUCENE_42)); // 创建query,表示搜索域为content中包含java的文档 Query query = parser.parse("target"); // 5.根据Searcher 搜索并且返回TopDocs,第二个参数表示要显示的条数 TopDocs tds = searcher.search(query, 10); // 6.根据TopDocs获取ScoreDoc对象 ScoreDoc[] sds = tds.scoreDocs; // score就是相关度最高的评分 for (ScoreDoc sd : sds) { // 7.根据Searcher和ScoreDoc对象获取具体的Document对象 Document d = searcher.doc(sd.doc);// 根据id获取文档 // 8.根据Document对象获取需要的值 content没有保存会输出null System.out.println(d.get("filename") + "[" + d.get("path") + "]" + d.get("content")); } // 9.关闭reader reader.close(); } catch (Exception e) { e.printStackTrace(); } } }
下图是运行index()后产生的文件:
相关文章推荐
- 重新学习Java——对象和类(二)
- 在虚拟机的linux中利用VMware Tools实现与windows共享文件
- 使用AVAudioPlayer播放网络音乐
- 算法分析中的实现n个数的全排列,使用java语言
- 录制视频(帧数版本) IOS
- OD快速找到MessageBox弹出对话框的位置
- python urllib2
- 如何打造一个人气博客?
- iOS 7已占iOS系统60%,Android相形见绌
- poj 1808 Quadratic Residues
- 冒泡排序
- javascript自动填写表单小技巧
- JavaScript数据类型检测详解
- Dictionary的遍历和修改
- 【2014校招】微软笔试
- C++执行外部程序(调用外部exe程序)
- ArcEngine中BaseCommand或BaseTool的用法举例
- C#画图
- 采用MQTT协议实现Android消息推
- sed 用法及实例