views:

17

answers:

1

The following code does not delete the document by Term as expected:

        RAMDirectory idx     = new RAMDirectory();
        IndexWriter writer  = new IndexWriter(idx,
                                   new SnowballAnalyzer(Version.LUCENE_30, "English"),
                                   IndexWriter.MaxFieldLength.LIMITED);
        Document doc = new Document();
        doc.add(new Field("title", "mydoc", Field.Store.YES, Field.Index.NO));
        doc.add(new Field("content", "some content, deleteme", Field.Store.YES, Field.Inde
x.ANALYZED));
        writer.addDocument(doc);
        Document doc2 = new Document();        
        doc2.add(new Field("title", "mydoc2", Field.Store.YES, Field.Index.NO));
        doc2.add(new Field("content", "other content, don't deleteme", Field.Store.YES, Field.I
ndex.ANALYZED));
        writer.addDocument(doc2);
        writer.optimize();
        writer.close();

        /*
        IndexReader reader = IndexReader.open(idx, false);
        int docs_up_for_deletion = reader.docFreq(new Term("title"));
        int before = reader.numDocs();
        int docs_deleted = reader.deleteDocuments(new Term("title", "mydoc"));
        reader.close();
        */

        IndexWriter writer2  = new IndexWriter(idx,
                                   new SnowballAnalyzer(Version.LUCENE_30, "English"),
                                   IndexWriter.MaxFieldLength.LIMITED);
        int before = writer2.numDocs();
        writer2.deleteDocuments(new Term("title", "mydoc"));
        writer2.commit();
        writer2.optimize();
        int after = writer2.numDocs();
        writer2.close();
        int docs_deleted = before - after;

I've tried deleting with the IndexReader and IndexWriter and neither works.

I've also tried adding another IndexReader search after the above code just in case the number only gets updated after closing writer2 (mentioned in this FAQ), but that doesn't help. Doing a writer.deleteAll() works, just not the delete by Term.

I found an old reference to the fact that only fields of type Field.Keyword can be deleted, but this is no longer a valid field type in Lucene 3.x

A: 

Your title field is not indexed. Change

new Field("title", "mydoc", Field.Store.YES, Field.Index.NO)

to

new Field("title", "mydoc", Field.Store.YES, Field.Index.ANALYZED)

or

new Field("title", "mydoc", Field.Store.YES, Field.Index.NOT_ANALYZED)

depending on whether or not you want your field analyzed.

bajafresh4life