lucene:如何执行增量索引并避免'删除和重做'

adh*_*dhg 3 java lucene

我有一个文件夹(MY_FILES),有大约500个文件,每天有一个新文件到达,它放在那里.每个文件的大小约为4Mb.

我刚刚开发了一个简单的'void main'来测试我是否可以在这些文件中搜索特定的通配符.它工作得很好.

问题是我正在删除旧的indexed_folder并重新索引.这需要花费很多时间,显然效率低下.我正在寻找的是"增量索引".意思是,如果索引已经存在 - 只需将新文件添加到索引中.

我想知道Lucene是否有某种机制来检查'doc'是否在尝试索引之前被编入索引.像writer.isDocExists这样的东西?

谢谢!

我的代码看起来像这样:

       // build the writer
       IndexWriter writer;
       IndexWriterConfig indexWriter = new IndexWriterConfig(Version.LUCENE_36, analyzer);
       writer = new IndexWriter(fsDir, indexWriter);
       writer.deleteAll();  //must - otherwise it will return duplicated result 
       //build the docs and add to writer
       File dir = new File(MY_FILES);
       File[] files = dir.listFiles();
       int counter = 0;
       for (File file : files) 
       { 
           String path = file.getCanonicalPath();
           FileReader reader = new FileReader(file);
           Document doc = new Document();  
           doc.add(new Field("filename", file.getName(), Field.Store.YES, Field.Index.ANALYZED));
           doc.add(new Field("path", path, Field.Store.YES, Field.Index.ANALYZED));
           doc.add(new Field("content", reader));  

           writer.addDocument(doc);
           System.out.println("indexing "+file.getName()+" "+ ++counter+"/"+files.length);
       }
Run Code Online (Sandbox Code Playgroud)

jpo*_*ntz 5

首先,您应该使用IndexWriter.updateDocument(Term, Document)而不是IndexWriter.addDocument更新文档,这将阻止您的索引包含重复的条目.

要执行增量索引,应将last-modified时间戳添加到索引的文档中,并且只索引较新的文档.

编辑:有关增量索引的更多详细信息

您的文档至少应包含两个字段:

  • 文件的路径
  • 最后一次修改文件时的时间戳.

在开始编制索引之前,只需在索引中搜索最新的时间戳,然后抓取您的目录以查找时间戳比索引的最新时间戳更新的所有文件.

这样,每次文件更改时,您的索引都会更新.