(1)Directory:
Directory类描述了Lucene索引的存放位置,它是一个抽象,其子类负责具体制定索引的存储路径。FSDirectory.open方法来获取真实文件在文件系统中的存储路径,然后将他们一次传递给IndexWriter类构造方法。
Directory dir = FSDirectory.open(new File(indexDir));
(2)IndexWriter:
负责创建新索引或者打开已有的索引,以及向索引中添加、删除或更新被索引文档的信息。
(3)Analyzer:
在文本文件被索引之前,需要经过Analyzer处理。Analyzer是由IndexWriter构造方法指定的,它负责从被索引文本文件中提取词汇单元,并剔除剩下的无用信息。
代码如下:
writer = new IndexWriter(dir, new StandardAnalyzer(Version.LUCENE_30), true, IndexWriter.MaxFieldLength.UNLIMITED);(4)Document:
Document对象代表一些域(Field)的集合。可以理解为如web页面、文本文件等。
Document对象的结构比较简单,为一个包含多个Field对象的容器
(5)Field:
指包含能被缩影的文本内容的类。索引中每个文档都有一个或多个不同的域,这些域包含在Field类中。
每个域都有一个域名和对应的域值,以及一组选项来精确控制Lucene索引操作各个域值。
代码解释:
public Indexer(String indexDir)throws IOException{ Directory dir = FSDirectory.open(new File(indexDir)); /* * Version.LUCENE_30:是版本号参数,Lucene会根据输入的版本值, * 针对该值对应的版本进行环境和行为匹配 */ writer = new IndexWriter(dir, new StandardAnalyzer(Version.LUCENE_30), true, IndexWriter.MaxFieldLength.UNLIMITED); }首先是Directory通过FSDirectory.open方法开辟一定空间来存储索引,并制定索引的存储路径。然后,创建IndexWriter对象来实现对索引文件的写入操作,如后面的:
writer.addDocument(doc)添加索引操作。同时,在IndexWriter构造方法中,制定了Analyzer分析器。
protected Document getDocument(File f) throws Exception{ Document doc = new Document(); /** * contents是域名, new FileReader(f)是域值 * filename是域名,f.getName是域值 * ....... */ doc.add(new Field("contents", new FileReader(f)));//索引文件内容 doc.add(new Field("filename", f.getName(),//索引文件名 Field.Store.YES, Field.Index.NOT_ANALYZED)); doc.add(new Field("fullpath", f.getCanonicalPath(),//索引文件完整路径 Field.Store.YES, Field.Index.NOT_ANALYZED)); return doc; }
numIndexed = indexer.index(dataDir, new TextFilesFilter());
...........
//返回被索引文档文档数 public int index(String dataDir, FileFilter filter)throws Exception{ File[] files = new File(dataDir).listFiles(); for(File f:files){ if(!f.isDirectory() && !f.isHidden()&& f.exists()&& f.canRead()&& (filter == null || filter.accept(f))){ indexFile(f); } } return writer.numDocs(); }
//向Lucene索引中添加文档 private void indexFile(File f) throws Exception{ System.out.println("Indexing "+f.getCanonicalPath()); Document doc = getDocument(f); writer.addDocument(doc); }