Indeed I think this is a real bug -- addIndexes(IR[]) should call flush(false, true), just like addIndexes(Dir[]) does.
Mike http://blog.mikemccandless.com On Sun, Mar 27, 2011 at 9:07 AM, Shai Erera <ser...@gmail.com> wrote: > 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 > --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@lucene.apache.org For additional commands, e-mail: dev-h...@lucene.apache.org