lucene: wie man eine inkrementelle Indizierung durchführt und 'delete and redo' vermeidet

Ich habe einen Ordner (MY_FILES) mit ca. 500 Dateien, und jeden Tag kommt eine neue Datei an, die dort abgelegt wird. Die Größe jeder Datei beträgt ca. 4 MB.

Ich habe gerade eine einfache Leerstelle entwickelt, um zu testen, ob ich in diesen Dateien nach einem bestimmten Platzhalter suchen kann. Es funktioniert gut.

Das Problem ist, dass ich den alten indexed_folder lösche und erneut indiziere. Dies nimmt viel Zeit in Anspruch und ist offensichtlich ineffizient. Was ich suche, ist eine "inkrementelle Indizierung". Das heißt, wenn der Index bereits vorhanden ist, fügen Sie einfach die neuen Dateien zum Index hinzu.

Ich habe mich gefragt, ob Lucene irgendeinen Mechanismus hat, um zu überprüfen, ob das 'doc' indiziert wurde, bevor er versucht, es zu indizieren. So etwas wie writer.isDocExists?

Vielen Dank!

Mein Code sieht so aus:

       // 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);
       }

Antworten auf die Frage(2)

Ihre Antwort auf die Frage