Lucene学习笔记(一)——入门示例

来源:互联网 发布:mac桌面便签软件 编辑:程序博客网 时间:2024/05/22 11:58

最近学习Lucene,在网上找到一个视频教程,学习了其中的入门示例,觉得对lucene的认识又深了一步,所以将视频中的例子改造下,供大家分享

1. 在 d:/lucene/example 文件夹下新建三个txt文件,为了便于理解,我这里建的三个文件夹和内容如下 

  (1) c++.txt : 我是C++程序员 

  (2) java.txt : 我是JAVA程序员

  (3) python.txt: 我是python程序员

2. 新建 D:\lucene\index 目录,用来存放lucene建立的索引

3. 写一个类,包括2个方法:创建索引方法,搜索方法

package com.lucene;import java.io.File;import java.io.FileReader;import java.io.IOException;import org.apache.lucene.analysis.standard.StandardAnalyzer;import org.apache.lucene.document.Document;import org.apache.lucene.document.Field;import org.apache.lucene.index.CorruptIndexException;import org.apache.lucene.index.IndexReader;import org.apache.lucene.index.IndexWriter;import org.apache.lucene.index.IndexWriterConfig;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.TopDocs;import org.apache.lucene.store.Directory;import org.apache.lucene.store.FSDirectory;import org.apache.lucene.util.Version;public class HelloLucene {/** * 创建索引 */public void index() {IndexWriter writer = null;try {// 1. 创建Directory(可以 选择建立在内存中或者硬盘中)// Directory directory = new RAMDirectory(); //内存Directory directory = FSDirectory.open(new File("d:/lucene/index"));//硬盘 // 2. 创建IndexWriterIndexWriterConfig iwc = new IndexWriterConfig(Version.LUCENE_36,new StandardAnalyzer(Version.LUCENE_36));writer = new IndexWriter(directory, iwc);// 3. 创建Document对象Document doc = null;// 4. 为Document添加Field(内容,文件名,路径)File f = new File("d:/lucene/example");for (File file : f.listFiles()) {doc = new Document();System.out.println(new FileReader(file));doc.add(new Field("content", new FileReader(file)));doc.add(new Field("filename", file.getName(), Field.Store.YES,Field.Index.NOT_ANALYZED));doc.add(new Field("path", file.getAbsolutePath(),Field.Store.YES, Field.Index.NOT_ANALYZED));// 5. 通过IndexWrite添加文档到索引中writer.addDocument(doc);}} catch (IOException e) {e.printStackTrace();} finally {try {if (writer != null) {// 6. 关闭writerwriter.close();}} catch (CorruptIndexException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}}/** * 搜索 */public void searcher() {try {// 1.创建DirectoryDirectory directory = FSDirectory.open(new File("d:/lucene/index"));// 2.创建IndexReaderIndexReader reader = IndexReader.open(directory);// 3.根据IndexReader创建IndexSearcherIndexSearcher searcher = new IndexSearcher(reader);// 4.创建搜索的Query// 创建parser来确定要搜索的文件的内容,第二个参数表示搜索的域QueryParser parser = new QueryParser(Version.LUCENE_36, "content",new StandardAnalyzer(Version.LUCENE_36));// 创建query,表示搜索域为content中包含java的文档Query query = parser.parse("java");// 5.根据searcher搜索并且返回TopDocsTopDocs tds = searcher.search(query, 10);// 6.根据TopDocs获取ScoreDoc对象ScoreDoc[] sds = tds.scoreDocs;for (ScoreDoc sd : sds) {// 7. 根据seacher和ScordDoc对象获取具体的Document对象Document d = searcher.doc(sd.doc);// 8. 根据Document对象获取需要的值System.out.println(d.get("filename") + "[" + d.get("path")+ "]");}// 9. 关闭readerreader.close();} catch (CorruptIndexException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} catch (ParseException e) {e.printStackTrace();}}}

4. 写测试方法进行测试,在使用lucene时推荐使用junit进行测试

package com.lucene;import org.junit.Test;public class CheckLucene {@Testpublic void testIndex(){HelloLucene hl = new HelloLucene();hl.index();}@Testpublic void testSerach(){HelloLucene hl = new HelloLucene();hl.searcher();}}

5. 测试结果

首先运行testIndex方法,运行完之后我们会发现 D:\lucene\index 目录下多出了很多文件,如下图所以


在运行testSearch方法,会出现下面的结果: 【 java.txt[d:\lucene\example\java.txt] 正好找到内容包含java这个词的文档


原创粉丝点击