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

Reply via email to