2010-09-14 41 views
1

通過期限刪除文件下面的代碼不能按預期期限由刪除文件:從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; 

我試着用的IndexReader和IndexWriter類既不作品刪除。

我也試過在上面的代碼之後添加另一個IndexReader搜索,以防數字在關閉writer2後出現更新(在this FAQ中提到),但這沒有幫助。做一個writer.deleteAll()的作品,而不是根據術語刪除。

我發現了一箇舊引用的事實,只有類型Field.Keyword的字段可以被刪除,但這不再是Lucene的3.x的一個有效字段類型

回答

1

你的標題字段不被索引。更改

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

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

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

取決於你是否希望你的領域進行分析。