Hello everyone, Here I try to increment update index file and follow the idea to delete modified file first and re-add it. Here is the source. But when I execute it, the index directory create a file(write.lock) when execute the line reader.delete(i);, and caught a class java.io.IOException with message: Index locked for write. After that, when I execute the line IndexWriter writer = new IndexWriter("index", new StandardAnalyzer(), false); caught a class java.io.IOException with message: Index locked for write if I delete the file(write.lock), the error will re-happen. anyone can help and thanks. Kerr.
import org.apache.lucene.analysis.standard.StandardAnalyzer; import org.apache.lucene.index.IndexWriter; import org.apache.lucene.document.Document; import org.apache.lucene.document.Field; import org.apache.lucene.store.Directory; import org.apache.lucene.store.FSDirectory; import org.apache.lucene.index.IndexReader; import org.apache.lucene.index.Term; import java.io.File; import java.util.Date; public class UpdateIndexFiles { public static void main(String[] args) { try { Date start = new Date(); Directory directory = FSDirectory.getDirectory("index", false); IndexReader reader = IndexReader.open(directory); System.out.println(reader.isLocked(directory)); //reader.unlock(directory); IndexWriter writer = new IndexWriter("index", new StandardAnalyzer(), false); String base = ""; if (args.length == 0){ base = "D:\\Tomcat\\webapps\\ROOT\\test"; } else { base = args[0]; } removeModifiedFiles(reader); updateIndexDocs(reader, writer, new File(base)); writer.optimize(); writer.close(); Date end = new Date(); System.out.print(end.getTime() - start.getTime()); System.out.println(" total milliseconds"); } catch (Exception e) { System.out.println(" caught a " + e.getClass() + "\n with message: " + e.getMessage()); e.printStackTrace(); } } public static void removeModifiedFiles(IndexReader reader) throws Exception { Document adoc; String path; File aFile; for (int i=0; i<reader.numDocs(); i++){ adoc = reader.document(i); path = adoc.get("path"); aFile = new File(path); if (reader.lastModified(path) < aFile.lastModified()){ System.out.println(reader.isLocked(path)); reader.delete(i); } } } public static void updateIndexDocs(IndexReader reader, IndexWriter writer, File file) throws Exception { if (file.isDirectory()) { String[] files = file.list(); for (int i = 0; i < files.length; i++) updateIndexDocs(reader, writer, new File(file, files[i])); } else { if (!reader.indexExists(file)){ System.out.println("adding " + file); writer.addDocument(FileDocument.Document(file)); } else {} } } }