2010-09-14 10 views
1

Le code suivant ne supprime pas le document par terme comme prévu:Supprimer document en terme de Lucene

 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; 

J'ai essayé de supprimer le IndexReader et IndexWriter et ne travaille.

J'ai également essayé d'ajouter une autre recherche IndexReader après le code ci-dessus juste au cas où le numéro ne serait mis à jour qu'après la fermeture de writer2 (mentionné dans this FAQ), mais cela n'aide pas. Faire un writer.deleteAll() fonctionne, mais pas la suppression par terme.

J'ai trouvé une vieille référence au fait que seuls les champs de type Field.Keyword peuvent être supprimés, mais ce n'est plus un type de champ valide dans Lucene 3.x

Répondre

1

champ Votre titre n'est pas indexé. Changer

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

à

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

ou

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

selon que vous souhaitez ou non votre domaine analysé.

Questions connexes