AnalyzerluceneAnalyzer=newStandardAnalyzer();
这条语句创建了类StandardAnalyzer的一个实例,这个类是用来从文本中提取出索引项的。它只是抽象类Analyzer的其中一个实现。Analyzer也有一些其它的子类,比如SimpleAnalyzer等。我们接着看另外一条语句:
IndexWriterindexWriter=newIndexWriter(indexDir,luceneAnalyzer,true);
这条语句创建了类IndexWriter的一个实例,该类也是Lucene索引机制里面的一个关键类。这个类能创建一个新的索引或者打开一个已存在的索引并为该所引添加文档。我们注意到该类的构造函数接受三个参数,第一个参数指定了存储索引文件的路径。第二个参数指定了在索引过程中使用什么样的分词器。最后一个参数是个布尔变量,如果值为真,那么就表示要创建一个新的索引,如果值为假,就表示打开一个已经存在的索引。接下来的代码演示了如何添加一个文档到索引文件中。
1Documentdocument=newDocument();23document.add(Field.Text("content",textReader));4document.add(Field.Text("path",textFiles[i].getPath()));5indexWriter.addDocument(document);
首先第一行创建了类Document的一个实例,它由一个或者多个的域(Field)组成。你可以把这个类想象成代表了一个实际的文档,比如一个HTML页面,一个PDF文档,或者一个文本文件。而类Document中的域一般就是实际文档的一些属性。比如对于一个HTML页面,它的域可能包括标题,内容,URL等。我们可以用不同类型的Field来控制文档的哪些内容应该索引,哪些内容应该存储。如果想获取更多的关于Lucene的域的信息,可以参考Lucene的帮助文档。代码的第二行和第三行为文档添加了两个域,每个域包含两个属性,分别是域的名字和域的内容。在我们的例子中两个域的名字分别是"content"和"path"。分别存储了我们需要索引的文本文件的内容和路径。最后一行把准备好的文档添加到了索引当中。当我们把文档添加到索引中后,不要忘记关闭索引,这样才保证Lucene把添加的文档写回到硬盘上。下面的一句代码演示了如何关闭索引。indexWriter.close();利用清单1中的代码,你就可以成功的将文本文档添加到索引中去。接下来我们看看对索引进行的另外一种重要的操作,从索引中删除文档。从索引中删除文档类IndexReader负责从一个已经存在的索引中删除文档,如清单2所示。
1FileindexDir=newFile("C:2\\luceneIndex");3IndexReaderir=IndexReader.open(indexDir);4ir.delete(1);5ir.delete(newTerm("path","C:\\file_to_index\lucene.txt"));6ir.close();
在清单2中,第二行用静态方法IndexReader.open(indexDir)初始化了类
IndexReader的一个实例,这个方法的参数指定了索引的存储路径。类IndexReader提供了两种方法去删除一个文档,如程序中的第三行和第四行所示。第三行利用文档的编号来删除文档。每个文档都有一个系统自动生成的编号。第四行删除了路径为"C:\\file_to_index\lucene.txt"的文档。你可以通过指定文件路径来方便的删除一个文档。值得注意的是虽然利用上述代码删除文档使得该文档不能被检索到,但是并没有物理上删除该文档。Lucene只是通过一个后缀名为.delete的文件来标记哪些文档已经被删除。既然没有物理上删除,我们可以方便的把这些标记为删除的文档恢复过来,如清单3所示,首先打开一个索引,然后调用方法ir.undeleteAll()来完成恢复工作。
FileindexDir=newFile("C:\\luceneIndex");IndexReaderir=IndexReader.open(indexDir);ir.undeleteAll();ir.close();
你现在也许想知道如何物理上删除索引中的文档,方法也非常简单。清单4演示了这个过程。4
1FileindexDir=newFile("C:\\luceneIndex");2AnalyzerluceneAnalyzer=newStandardAnalyzer();3IndexWriterindexWriter=new4IndexWriter(indexDir,luceneAnalyzer,false);5indexWriter.optimize();6indexWriter.close();在清单4中,第三行创建了类IndexWriter的一个实例,并且打开了一个已经