Hi One of our users stumbled upon what seems to be a bug in trunk (didn't verify yet against 3x but I have a feeling it exists there as well). The scenario is: you want to add an index into an existing index. Beforehand, you want to delete all new docs from the existing index. These are the operations that are performed: 1) deleteDocuments(Term) for all the new documents 2) addIndexes(IndexReader) 3) commit
Strangely, it looks like the deleteDocs happens *after* addIndexes. Even more strangely, if addIndexes(Directory) is called, the deletes are applied *before* addIndexes. This user needs to use addIndexes(IndexReader) in order to rewrite payloads using PayloadProcessorProvider. He reported this error using a "3x" checkout which is before the RC branch (as he intends to use 3.1). I wrote a short unit test that demonstrates this bug on trunk: {code} private static IndexWriter createIndex(Directory dir) throws Exception { IndexWriterConfig conf = new IndexWriterConfig(Version.LUCENE_40, new MockAnalyzer()); IndexWriter writer = new IndexWriter(dir, conf); Document doc = new Document(); doc.add(new Field("id", "myid", Store.NO, Index.NOT_ANALYZED_NO_NORMS)); writer.addDocument(doc); writer.commit(); return writer; } public static void main(String[] args) throws Exception { // Create the first index Directory dir = new RAMDirectory(); IndexWriter writer = createIndex(dir); // Create the second index Directory dir1 = new RAMDirectory(); createIndex(dir1); // Now delete the document writer.deleteDocuments(new Term("id", "myid")); writer.addIndexes(IndexReader.open(dir1)); // writer.addIndexes(dir1); writer.commit(); System.out.println("numDocs=" + writer.numDocs()); writer.close(); } {code} The test as it is prints "numDocs=0", while if you switch the addIndexes calls, it prints 1 (which should be the correct answer). Before I open an issue for this, I wanted to verify that it's indeed a bug and I haven't missed anything in the expected behavior of these two addIndexes. If indeed it's a bug, I think it should be a blocker for 3.1? I'll also make a worthy junit test out of it. BTW, the user, as an intermediary solution, extends IndexWriter and calls flush() before the delete and addIndexes calls. It would be preferable if this solution can be avoided. Shai